STL中的内存管理为两级配置器,一级配置器是当申请内存大于128B时候使用系统函数malloc/free进行申请释放。
二级配置器,将内存块分为大小间距为8的16个8B到128B的等长度的chunk,使用数组+链表管理。数组中存储的是大小相同的用链表链接起来的内存块。在STL中使用长度为16的数组,0处存储8Byte,然后依次16,24,36.....依次加8字节。二级配置器维护着一个内存池,如果所申请的内存块对应的数组的链表下为空,就向池中申请,如果池中为空或者不够则就通过malloc来进行申请内存。
申请内存,首先判断是否超过128B,否则使用一级配置器。使用二级配置器,求得精确申请的内存的大小,内存对齐8。然后再定位到该大小所在的数组下的链表。判断链表是否为空,不空就返回第一个结点给用户,空则查看池中是否为空。内存池中有几种情况,第一有超过20个块的大小,则返回这20个,第二不超过20个,返回最大达到的块数,第三不足一个就将这一个链接到数组中合适的位置。如果为空则就通过malloc向池中注入2倍的所需要的+n内存即这次所申请的内存块大小的40倍大小+n,将20个大小的块连入到该数组下标下,其中的第0