STL Allocator 二级分配器
2.3 STL 怎么做内存管理的,Allocator 次级分配器的原理,内存池的优势和劣势?¶
(1)为了提升内存管理的效率,减少申请小内存造成的内存碎片问题,SGI STL 采用了两级配置器,当分配的空间大小超过 128B 时,会使用第一级空间配置器,直接使用 malloc()、realloc()、free()函数进行内存空间的分配和释放。当分配的空间大小小于 128B 时,将使用第二级空间配置器,采用了内存池技术,通过空闲链表来管理内存。
(2)次级配置器的内存池管理技术:每次配置一大块内存,并维护对应的自由链表(free list)。若下次再有相同大小的内存配置,就直接从自由链表中拔出。如果客户端释还小额区块,就由配置器回收到自由链表中;配置器共要维护 16 个自由链表,存放在一个数组里,分别管理大小为 8-128B 不等的内存块。分配空间的时候,首先根据所需空间的大小(调整为 8B 的倍数)找到对应的自由链表中相应大小的链表,并从链表中拔出第一个可用的区块;回收的时候也是一样的步骤,先找到对应的自由链表,并插到第一个区块的位置。
(3)优势:避免内存碎片(这里应该指的是外部碎片),不需要频繁从用户态切换到内核态,性能高效;劣势:仍然会造成一定的内存浪费,比如申请 120B 就必须分配 128B(内部碎片)。