stl里面的空间适配器

一般而言,如果频繁地向system heap申请和释放空间很小的内存空间块(小于128B的),就会对系统内存资源产生很多内存碎片(fragment)的问题,而C++的::operator new() 和 ::opeartor delete() 相当于C的 malloc() 和 free(), 所以stl为此设置了双层的内存配置器,当申请的空间大于128B时 就使用第一级配置器,如果小于128B就使用第二级配置器

关于第一级allocator: 实际是使用malloc free realloc 等C函数执行实际的内存配置,释放,重配置操作

关于第二级allocator: 本质上是一个内存池(memory pool), 先配置一大块的内存, 并用自由链表(free list)进行维护·

 内存池的结构:

一共有16个free list 各自管理大小为 8,16,24,32,40,,,,128Bytes的小额区块

 

freelist 使用了union 结构来节省对指针所造成的内存开销如下图:

unionobj {

union obj * free_list_link;

char client_data[1]; /* The client sees this. */

};

题外思考:

 

我们现在真的还需要考虑内存碎片的问题吗?https://www.zhihu.com/question/21894104

 推荐阅读陈硕的回答以及他所给出的链接.

 

一个或许让程序员无需关心内存碎片问题的malloc的api:

TCmalloc 的介绍: http://goog-perftools.sourceforge.net/doc/tcmalloc.html

原文地址:https://www.cnblogs.com/jusonalien/p/5243809.html