一般而言,如果频繁地向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