Skip to content

STL的内存优化

STL内存管理使用二级内存配置器

1、第一级配置器

第一级配置器以malloc(),free(),realloc()等C函数执行实际的内存配置、释放、重新配置等操作,并且能在内存需求不被满足的时候,调用一个指定的函数。

一级空间配置器分配的是大于128字节的空间

  • 如果分配不成功,调用句柄释放一部分内存
  • 如果还不能分配成功,抛出异常

2、第二级配置器

在STL的第二级配置器中多了一些机制,避免太多小区块造成的内存碎片,小额区块带来的不仅是内存碎片,配置时还有额外的负担。区块越小,额外负担所占比例就越大。

分配原则

  1. 如果要分配的区块大于128bytes,则移交给第一级配置器处理。
  2. 如果要分配的区块小于128bytes,则以内存池管理(memory pool),又称之次层配置(sub-allocation):每次配置一大块内存,并维护对应的16个空闲链表(free-list)。下次若有相同大小的内存需求,则直接从free-list中取。如果有小额区块被释放,则由配置器回收到free-list中。

当用户申请的空间小于128字节时,将字节数扩展到8的倍数,然后在自由链表中查找对应大小的子链表

如果在自由链表查找不到或者块数不够,则向内存池进行申请,一般一次申请20块

  • 如果内存池空间足够,则取出内存
  • 如果不够分配20块,则分配最多的块数给自由链表,并且更新每次申请的块数
  • 如果一块都无法提供,则把剩余的内存挂到自由链表,然后向系统heap申请空间,如果申请失败,则看看自由链表还有没有可用的块,如果也没有,则最后调用一级空间配置器