C++STL之空间配置器

1. STL分配内存方式

第一步:调用alloc分配足够大内存;
第二步:调用construct对内存进行初始化;
第三步:调用destroy对对象进行析构;
第四步:调用free对内存进行释放。

2. alloc/free

STL通过两种方式进行内存申请,第一种为第一级配置器,第二种为第二级配置器+第一级配置器。

2.1 第一级配置器

使用malloc(),free(),realloc()等C函数进行内存的分配和释放。

2.2 第二级配置器

对于小于等于128 bytes的内存申请,进行单独维护管理,维护一个长度为16的free_list指针数组,包含16个指针,每个指针分别指向8,16, 24,…,128 bytes的内存区域,每个内存区域由相应大小的内存块以链表的形式连接而成。
C++STL之空间配置器

2.3 alloc配置流程

  1. 若所申请内存大于128 bytes,直接调用第一级配置器进行内存分配;
  2. 若所申请内存小于128 bytes,将内存上调至8的倍数(例如申请30 bytes的内存,上调至32 bytes),然后从指定的free_list区域获取内存。
  3. 若指定区域内存足够,分配完内存后,相应的free_list[x]指向该区域的下一块内存。
  4. 若指定区域无内存块,则需要向内存池申请内存,进行重新填充。一般重新填充20个内存块。
  5. 若内存池有足够的内存分配20个该大小的内存块,则进行重新填充。
  6. 若内存池拥有的内存只能供应大于等于1个,小于20个的内存块,则填充足够多的内存块。
  7. 若内存池一个内存块都不能供应,则需要向堆进行内存申请。
  8. 若内存池向堆申请不到内存,则移交第一级配置器,触发bad_malloc异常。
    C++STL之空间配置器
  9. 进行free时,将内存块放入指定区域内,该内存块作为该区域的第一块内存。

3. construct /destroy

  1. 进行初始化时,接受一个指针和一个初值对对象进行构造。
  2. 进行析构时,有两种方案,第一种接受一个指针,直接调用该对象的析构析构函数。第二种接受first和last迭代器,将该范围(前闭后开)所有对象进行析构,这里需要对每个对象进行类型判断,忽略不必要的析构,从而提高系统效率。