• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-04-25)  STL |   抢沙发  12 
    文章评分 0 次,平均分 0.0

    由于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提供的默认配置器。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/855.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享