STL的allocator
STL的分配器用于封装STL容器在内存管理的底层细节。在C++中,其内存配置和释放如下:
new运算分成两个阶段:
(1)调用::operator new配置内存;
(2)调用对象构造函数构造对象内容。
delete运算分成两个阶段:
(1)调用析对象析构函数;
(2)调用::operator delete释放内存。
为了精密分工,STL allocator将两个阶段操作区分开来:
- 内存配置有alloc::allocate()负责,内存释放由alloc::deallocate()负责;
- 对象构造由::construct()负责,对象析构由::destroy()负责。
同时为了提升内存管理的效率,减少申请小内存造成的内存碎片问题,SGI STL采用了两级配置器,当分配的空间大小超过128B时,会使用第一级空间配置器;当分配的空间大小小于128B时,将使用第二级空间配置器。第一级空间配置器直接使用malloc()、realloc()、free()函数进行内存空间的分配和释放,而第二级空间配置器采用了内存池技术,通过空闲链表来管理内存。