STL源码剖析——内存配置和释放

一级空间配置器

其中__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机制处理。

*/

}

/*将申请的内存块返回给用户*/

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值