下载此文档

SGI STL空间配置器和内存池.pdf


文档分类:通信/电子 | 页数:约2页 举报非法文档有奖
1/ 2
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/ 2 下载此文档
文档列表 文档介绍
踏雪无痕
SGI STL空间配置器和内存池
分类: C++ 2012-07-20 14:00 106人阅读评论(0) 收藏举报
最近在看侯捷老师的《STL源码剖析》,非常感叹其中空间配置器实现的巧妙和细致,对效率真正是锱铢必较。
一般我们所习惯的内存配置和释放是通过new和delete来完成的,而new运算包含了两个阶段:::operator
new配置内存 Foo() 构造对象。delete运算也包含两个阶段:~Foo() 将对象析构
::operator delete释放内存。
1 class Foo { …};
2 Foo *pf = new Foo;
3 delete pf;
而SGI STL为了提高效率则是把二者分开的,对象的构造的析构由 construct() 和 destroy() 完成,内存的配置则
是由std::alloc完成,alloc是SGI STL中的默认空间配置器,它是具有次层配置能力的,分为一级配置器和二级配
置器,一级配置器直接由 malloc() 和 free() 这两个 C 函数完成,二级配置器就复杂了,它根据不同的情况而采
取不同的策略,当申请的内存区块大于128bytes时,就移交给一级配置器处理,小于128bytes则由二级配置器采用
复杂的内存池( memery pool )完成,这主要是为了减少内存碎片的产生,而且还能降低额外负担,什么负担呢?我
们每申请一块内存,都要向系统上缴一部分“税”,当然这些税取之于民也用之于民,主要是用来记录内存的相关
信息,如大小之类的,所以当内存越小时这种额外的负担就越大。
一级配置器会在内存不足( out-of-memory) 时,调用oom_malloc(),执行内存不足处理例
程,__malloc_alloc_oom_handler() = 0; 不断尝试释放其它内存,请注意该处理例程是要用户自己设计的并且要
自己设定的!否则系统会毫不客气的调用_THROW_BAD_ALLOC,抛出 bad_alloc 异常信息,或者直接 exit(1) 来终
止程序!其中__THROW_BAD_ALLOC是一个宏:

1 #if 0
2 # include <new>
3 # define __THROW_BAD_ALLOC throw bad_alloc
4 #elif !define( __THROW_BAD_ALLOC)
5 # include <>
6 #define __THROW_BAD_ALLOC cerr<<" out of memory "<<endl;exit(1)
7 #endif

然后我们看二级配置器,它是以内存池( memory pool ) 来管理的:它由16个自由链表构成,每次配置一大块内
存,并维护对应之自由链表( free-lists ),下次若有相同大小的内存请求,就直接从free-lists 中拨出这块内
存,同时,如果客端释放小额区块时,刚把它回收到对应大小的自由链表( free-lists )中。
这16个肩负重任的 free-lists 分别管理大小为
8,16,24,32,40,56,64,

SGI STL空间配置器和内存池 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数 2
  • 收藏数 0 收藏
  • 顶次数 0
  • 上传人 翩仙妙玉
  • 文件大小 0 KB
  • 时间2012-09-16
最近更新