STL-空间配置器

空间配置器

空间配置器,就是用来配置、管理和释放空间的,给所有的容器包括算法提供生存空间。

作用

  1. 提高代码复用率,功能模块化;
  2. 减少内存碎片问题;
  3. 提高内存分配的效率;
  4. 有内存不足时的应对措施;
  5. 隐藏实际中对存储空间的分配及释放细节,确保所有被分配的存储空间都最终获得释放;
  6. 考虑多线程状态。

策略

用户申请空间大于128?

yes:调用一级空间配置器

no:调用二级空间配置器

一级空间配置器

一级空间配置器直接封装mallocfree进行处理,增加了C++中的set_handler机制(这里其实也就是个略显牵强的装饰/适配模式了),增加内存分配时客户端可选处理机制。

实现原理

Allocate用于分配空间,如果申请失败,用oom_alloc重新尝试申请。

Deallocate用于释放空间。

Reallocate用于根据需要自己调整已经存在的空间大小,如果申请调整失败,用oom_realloc尝试申请。

二级空间配置器

二级配置器使用内存池+自由链表的形式避免了小块内存带来的碎片化,提高了分配的效率,提高了利用率。

它是用一个16个元素的自由链表(free_list)来管理的,每个位置的内存大小都是8的倍数,分别为:8、16、24、32、40、48、56、64、72、80、88、96、104、112、120、128。

基本过程

用户申请空间->检查链表中是否挂有空闲节点?

是:取走返回,Allocate()

否:自由链表向内存池申请节点Refill()

  内存池是否有足够空间?Chunk()

  是:取内存连接到链表,返回一个给用户

  否:malloc补充内存池,逐级返回malloc

二级配置器实现了对小内存的高效管理,使内部碎片出现的概率大大降低。