STL的非标准空间配置器alloc

2013年4月25日 由 Creater 留言 »

由于STL中既有标准的空间配置器alloctor还有专属的非标准alloc配置器,那么alloc是什么样的呢?
代码中可见

typedef __malloc_alloc_template<0> malloc_alloc;
或者
typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0> alloc;

由上可以看出端倪,alloc要么是__malloc_alloc_template或者__default_alloc_template。

template <int inst>
class __malloc_alloc_template {

private:

static void *oom_malloc(size_t);

static void *oom_realloc(void *, size_t);

#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG
    static void (* __malloc_alloc_oom_handler)();
#endif

public:

static void * allocate(size_t n)
{
    void *result = malloc(n);
    if (0 == result) result = oom_malloc(n);
    return result;
}

static void deallocate(void *p, size_t /* n */)
{
    free(p);
}

static void * reallocate(void *p, size_t /* old_sz */, size_t new_sz)
{
    void * result = realloc(p, new_sz);
    if (0 == result) result = oom_realloc(p, new_sz);
    return result;
}

static void (* set_malloc_handler(void (*f)()))()
{
    void (* old)() = __malloc_alloc_oom_handler;
    __malloc_alloc_oom_handler = f;
    return(old);
}

};

其实__malloc_alloc_template就是STL的第一级空间配置器,__default_alloc_template为第二级空间配置器(代码略),从该模板类定义可以看出,包含了很多不符合标准的函数,所以为了满足标准。无论alloc被定义成第一级还是第二级配置器,都需要包装一下,使得他符合STL规格:

template<class T, class Alloc>
class simple_alloc {

public:
    static T *allocate(size_t n)
                { return 0 == n? 0 : (T*) Alloc::allocate(n * sizeof (T)); }
    static T *allocate(void)
                { return (T*) Alloc::allocate(sizeof (T)); }
    static void deallocate(T *p, size_t n)
                { if (0 != n) Alloc::deallocate(p, n * sizeof (T)); }
    static void deallocate(T *p)
                { Alloc::deallocate(p, sizeof (T)); }
};

那么如何使用配置器呢?以vector为例

template <class T, class Alloc = alloc>
class vector {
 typedef simple_alloc<value_type, Alloc> data_allocator;//+++++++++++++++
 .....
 iterator new_start = data_allocator::allocate(len);
 ....
 data_allocator::deallocate(new_start, len);
 .....
};

到这里来了,我们就可以定义自己的配置器myAlloc,主要满足这里的一些函数和类型定义即可。
比如我们在使用vector的时候就可以vector myVec;这样myVec就会使用我们的配置器而不是STL提供的默认配置器。

广告位

发表评论

你必须 登陆 方可发表评论.