一级空间配置器
其中__malloc_alloc_template<>
public: static void * allocate(size_t n) //直到分配成功返回或抛异常,调用oom_malloc static void deallocate(void *p, size_t /* n */) static void * reallocate(void *p, size_t /* old_sz */, size_t new_sz) //直到分配成功返回或抛异常,调用oom_realloc // 模拟C++标准的std::set_new_handle全局函数设置内存分配失败后的处理例程 static void (* set_malloc_handler(void (*f)()))() private: static void *oom_malloc(size_t); static void *oom_realloc(void *, size_t); |
讨论:
template<int inst>
class__malloc_alloc_template {...}
SGI为什么要用这个模板呢, 可不可以不用模板, 直接把这个类定义成普通类呢?
(网友答案)inst这里仅仅只是为了定义多个内容相同的class但是class类型不同。
例如xx_template<0>和xx_template<1>完全一样但是类型不同。
inst可以看成是instantiation或者instance(实例)的缩写。
为什么要这样做呢?没太读过SGI代码,不知道作者怎么想的。但是SGI中貌似很多地方都用了inst这种方法来实例多个内容一样但类型不同的class,不仅仅是mem_allocator这里。
二级空间配置器:SGI不对用户开放使用
template<bool thread, int inst> class __default_alloc_template{ … static void *refill(size_t n); // 重新填充内存链表 static void * allocate(size_t n); static void deallocate(void *p, size_t n); static void * reallocate(void *p, size_t old_sz, size_t new_sz); } |
STL二级内存配置器分配策略
SGI STL的二级内存配置器机制在申请配置空间<128k时启用,而当申请空间>=128k时,调用第一级配置器。
// 模板类拥有配置器的标准接口static void * allocate(size_t n) static void * allocate(size_t n){ if(n>128) return malloc_alloc::allocate(n); // 申请空间>=128,交由一级配置器处理 if(从空闲内存链表簇挑选最合适内存链表,然后拿一个内存块出来){ // 若链表中内存块不够,则需要调用refill()方法重新填充内存链表,具体策略 /* 1. 先从内存池中申请20个内存块给链表,从中拿出一个返回给用户; 2. 若内存池中空间也不够,则优先查看内不能从其他空闲内存链表中挤出一块内存给用户; 3. 若2步仍然不能完成,则从系统的全局堆区申请40个内存块,其中20个划给内存池,19个分给空闲链表,1个返回给申请者; 4. 若全局堆区空间配置仍然失败,则则调用一级配置器,尝试使用out-of-memory机制处理。 */ } /*将申请的内存块返回给用户*/ } |