C++中的内存优化采用两级的空间配置器机制来解决。
二级配置器结构:
1. 第一级配置器:
第一级配置器是以malloc(),remalloc(),free()等C函数执行实际的内存配置,释放,重新配置等操作。一级空间配置器分配的是大于128字节的空间。如果分配失败,调用句柄释放一部分内存。如果还是失败,调用一个指定的函数。
如果要分配的区块小于128字节,则以内存池进行管理,内存池又称为次层配置器(sub-allocation):每次配置一大块内存,并维护对应的16个空闲链表(free-list),下次若有相同大小的内存需求,直接从free-list中取,若有小额区块被释放,则由配置器回收到free-list中。
在STL的第二级配置器中多了一些机制,避免太多小区快造成的内存碎片,小区块造成的不仅仅是内存碎片,同时还有一些额外的负担。区块越小,额外的负担所占的比重越大。
2. 内存池:
二级空间配置器:内存池采用了16个空闲链表,这里的16个空闲链表分别管理大小为8,16,24,32,……,120,128的数据块。这里的空闲链表的结点设计为一个联合体,既可以用来表示下一个空闲的数据块(存在于空闲链表中)的地址,也可以用来表示已经被用户使用的数据块(不存在与空闲链表中)的地址。
< |