一、STL内存配置器的总体设计结构
1.两级内存配置器:SGI-STL中设计了两级的内存配置器,主要用于不同大小的内存分配需求,当需要分配的内存大小大于128bytes时,
使用第一级配置器,否则使用第二级配置器;对于小块的内存的分配使用第二级配置器使用分配与释放内存块的效率更高,时间复杂度为O(1);
2.两级配置器的优点:
(1)使用两级配置器主要是为了避免太多的小块的内存申请导致内存空间中的内存碎片问题;
(2)使用第二级配置器也可以避免太多小块内存分配导致的内存空间浪费问题,因为在申请内存块时内存块的一部分必须记录该被分配的内存块
的大小,在第二级配置器中则不需要记录分配的内存块的大小;
(3)第二级配置器同样也使小块的内存分配与释放效率更快,复杂度为O(1),而普通的首次适配、下次适配、最佳适配算法都无法达到分配与释
放内存块的时间复杂度都为O(1);
二、第一级配置器
1.功能:第一级配置器支持allocate,reallocate,deallocate,set_malloc_handler功能;
2.与C语言内存分配函数的比较:相比C语言中的malloc,realloc,free函数而言,第一级配置器是C语言中内存分配函数的一层包装,其相应的功能分
别调用对应的C语言内存分配函数;
3.第一级配置器的内存分配失败处理功能:第一级配置器增加了处理内存分配失败的机制,set_malloc_handler函数允许用户指定一个函数用于内存
分配失败的处理,当内存分配失败时第一级配置器会调用该函数,如果用户没有指定特定的处理函数,则根据实际情况,根据用户的选择抛出内存分
配失败的异常或者在标准错误流中打印出错信息;
三、第二级配置器
1.第二级配置器的结构:第二级配置器含有一个内存池以及用于管理8的整数倍大小的16个free lists;free lists用来分配小块的内存,内存池用来
填充free lists,使每个free lists含有足够的小块内存用于分配,当free list没有足够的小型的内存块用于分配时,向内存块申请内存填充free list;
2.内存池:内存池实际上是一个使用malloc分配的一个足够大的内存块;
3.free lists:在堆的分配算法中存在首次适配、下次适配、最佳适配算法。同样,堆中内存块的组织方法有隐式空闲链表,显示空闲链表和分离链表法,
free lists即为分离链表法,该方法的优点为分配与释放内存都是O(1)的时间,虽然SGI-STL使用的是普通的分离存储方法,而不是分离适配方法,这会
导致部分空间的浪费,然而由于内存块的浪费在0-8bytes之间,相比较而言,对于经常需要较小的内存块分配的程序而言效率的提高更大;
四、SGI-STL内存分配算法流程图