SGI空间分配器之第一级配置器剖析

/*
用途:用于分配内存空间的模板,作为第一级分配;
模板形参:无意义,模板内没有使用
接口函数:allocate函数用于分配空间
          reallocate函数用于指定地址重新分配空间
          deallocate函数用于释放空间
          set_malloc_hander函数用于获取“内存不足处理例程”的函数
时间:2014-12-4
*/
template <int inst>
class __malloc_alloc_template
{
private:
    typedef void (*Func)();//定义一个函数指针类型为Func表示void (*)()
public:
    static void* allocate(size_t n)
    {
        void *result=malloc(n);
        if(0==result)
        {//stl_alloc.h中的oom_malloc(n);处理过程
            Func my_malloc_handler;//定义一个临时的函数指针变量。
            for(;;)
            {//此处若是给了处理内存函数,那么总是会循环的,知道处理好了(实例内在应该会过多久时间而让程序退出)。
                my_malloc_handler=__malloc_alloc_oom_handler;
                if(0==my_malloc_handler){__THROW_BAD_ALLOC;}//表示没有内存不够处理历程则丢错,结束。
                (*my_malloc_handler)();//解引用后调用该函数指针所指函数;即运行历程处理。
                result=malloc(n);//再次调用分配内存函数
                if(result) return(result);//如果成功分配,则结束;否则就继续历程处理,继续内存分配
            }
        }
        return result;
    }
    static void deallocate(void *p,size_t n)//实质上只是用了P
    {
        free(p);
    }
    static void* reallocate(void *p,size_t oldSZ,size_t newSZ)//老的内存大小无用了
    {

        void *result=remalloc(p,newSZ);//本身功能就是将旧的内容拷贝到新的内容中,且自己寻找内存块
        //类似处理
        /*异常处理块

        */
        return result;
    }
    //static void (* set_malloc_hander(void (*f)))()
    static Func set_malloc_hander(Func f)//用于获取历程处理的函数;且返回之前的历程处理函数
    {
        Func old=__malloc_alloc_oom_handler;
        __malloc_alloc_oom_handler=f;
        return old;
    }
private:
    //定义一个函数指针变量,用于指定处理内存不足处理历程,也可以为static Func __malloc_alloc_oom_handler;
    static void (* __malloc_alloc_oom_handler)();
};
时间: 2024-11-03 21:47:41

SGI空间分配器之第一级配置器剖析的相关文章

SGI空间分配器之第二级配置器剖析

template<bool threads,int inst> class __default_alloc_template { private: enum {__ALIGN=8}; enum {__MAX_BYTES=128;}; enum {__NFREELISTS=__MAX_BYTES/__ALIGN}; /*struct obj { struct obj* free_list_link; };*/ //结构体和下面,在此处中是效果一致的.本模板采取此数据结构 //相对好处,不是很明白

STL源码分析--空间配置器 第一级配置器

一.SGI STL配置器简介 SGI STL的配置器与众不同,它与标准规范不同.如果要在程序中明确使用SGI配置器,那么应该这样写: [cpp] view plaincopyprint? vector<int,std::alloc> iv; 他的名字是alloc,而且不接受任何参数.标准配置器的名字是allocator,而且可以接受参数. SGI STL的每一个容器都已经指定了缺省配置器:alloc.我们很少需要自己去指定空间配置器.比如vector容器的声明: [cpp] view plai

第一级配置器 --—_ _malloc_alloc_template剖析

程通常被称为new-handler. 注:设计"内存不足处理例程"是客户端的责任,设定"内存不足处理例程"也是客户端的责任. 版权声明:本文为博主原创文章,未经博主允许不得转载.

STL初探——第二级配置器 __default_alloc_template的学习心得

SGI STL 第二级配置器使用的是memory pool,即内存池,相比较于第一级空间配置器,第二级空间配置器多了许多限制,主要是为了防止申请小额区块过多而造成内存碎片.当然小额区块在配置时实际上是对空间配置器效率的一种伤害.另外,索求任何一块内存,都得需要一些额外内存来进行标记,虽然这些标记占内存很小很小,但蚂蚁多咬死象,小区块多了,这些小标记还是挺浪费内存的,但这也无法避免,毕竟系统需要靠这些小标记管理内存. SGI 第二级配置器的做法是,如果区块足够大,超过128bytes时,就移交第一

STL初探——第一级配置 __malloc_alloc_template的学习心得

在第一级配置器中,一开始就定义了内存分配出错的宏接口,如下: #ifndef __THROW_BAD_ALLOC # if defined(__STL_NO_BAD_ALLOC) || !defined(__STL_USE_EXCEPTIONS) # include <stdio.h> # include <stdlib.h> # define __THROW_BAD_ALLOC fprintf(stderr, "out of memory\n"); exit(

第二级配置器 _ _default_alloc_template 剖析

第二级配置器  _default_alloc_template 版权声明:本文为博主原创文章,未经博主允许不得转载.

【STL】空间配置器剖析(二)

上篇文章点击打开链接主要对于对象的构造含和析构进行了主要说明,这篇文章将对对象构造前的内存配置和对象析构后的空间释放进行深入探索. 好的,话不多说马上进入是正文: 对对象构造前的内存配置和对象析构后的空间释放,由<stl_alloc.h>负责,SGI对此的设计哲学如下: 向system heap要求空间. 考虑多线程的状态 考虑内存不足的应变措施 考虑过多的"小型区块"可能造成的内存碎片问题 C++的内存配置的基本操作是:operator new(),内存释放的基本操作是o

STL-空间配置器剖析

网上有很多对于STL空间配置器源码的剖析,之所以这么多人去剖析空间配置器,我觉得是真的设计的太好,而且剖析空间配置器的架构的设计对于C++学者来说是一个不错的提高能力的项目,所以加入到这个解剖大军中来. 参照了侯捷的<STL源码剖析>,原本直接看源码不懂得东西,突然间豁然开朗.再次写下自己对于STL空间配置器的一点点理解. 要了解空间配置器,有一张图是必看的: 这张图是一级空间配置器宇二级空间配置器的封装方式与调用.从此图我们们可以看到其实空间配置器是分为两级的,而这里所谓的两级并没有高低之分

SGI STL第二级空间配置器空间释放函数deallocate

union obj{ obj * free_list_link ; char client_data[1] ; }; __default_alloc_template拥有配置器标准接口函数deallocate().该函数首先判断区块大小,大于128bytes就调用第一级配置器,小于128bytes就找出相应的free list将区块回收: <span style="font-size:18px;">//p is not 0/null static void dealloca