在STL中,对空间适配器allocator的操作分为两个部分,其中一个部分是alloc类提供的接口,分别负责内存配置(alloc: :allocate)和内存释放(alloc: :deallocate)。
设计需求:
- 向堆申请空间
- 需要考虑多线程状态(该问题比较复杂,这里不考虑)
- 需要考虑内存不足时的措施
- 需要考虑小型区块造成的内存碎片问题
向堆申请空间可以简单的使用malloc函数来完成,所以我们主要需要解决的问题就是最后两个,需要用到一定内存管理的知识。
内存碎片问题:
由于内存分配时要根据不同的标准进行对齐,所以通常会造成内存碎片的问题,为了解决这个问题,STL提供的配置器有两种配置方式,或者说是双层配置器。当需要分配的内存足够大时,内存分配造成的内存碎片影响较小,可以直接用malloc函数来分配,这是第一层适配器;当进行小型区块分配时,一旦分配次数较多,造成的内存碎片就会比较严重,我们需要通过某种内存管理手段来缓解这个问题。
解决方法:维护free_list(自由链表)来分配合适的内存块;内存块由内存池来分配
————————————————————————————————————————————
free_lists
free_lists包括16个free_list,换句话说就是一个包含16个链表的的链表数组,每个链表管理的内存大小均为8的倍数,这是因为内存分配默认8字节对齐,free_list的结点定义如下:
union obj {
union obj *next;
char client_data[1];
}
显然这是一