SGI STL 空间配置器allocator介绍
SGI STL有两个 allocator
(空间配置器)
一级allocator
内存管理使用 malloc/free
;
二级allocator
使用内存池实现
容器底层存储的对象的构造和析构,定义的是全局的函数模板construct
和destroy
完成,比如:
void push_back(const _Tp& __x) {
if (_M_finish != _M_end_of_storage) {
construct(_M_finish, __x); // 调用定位new
++_M_finish;
}
else
_M_insert_aux(end(), __x);
}
void pop_back() {
--_M_finish;
destroy(_M_finish); // 转调用析构函数
}
void allocator::construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }
void allocator::destroy(pointer __p) { __p->~_Tp(); }
重要类型和变量定义
在文件 stl_alloc.h中:
// 内存池的粒度信息
enum {_ALIGN = 8}; // 内存池分配内存对齐单位
enum {_MAX_BYTES = 128};
enum {_NFREELISTS = 16}; // 自由链表数量
// 每个内存chunk块的头信息
union _Obj {
union _Obj* _M_free_list_link;
char _M_client_data[1]; /* The client sees this. */
};
// 组织自由链表的数组,数组的每个元素是 _Obj*,全部初始化为0
static _Obj* __STL_VOLATILE _S_free_list[_NFREELISTS]; // 内存池最大的分配单位是128B,16个trunk的list
自由链表数组图示如下
Chunk allocation state. 记录内存chunk块的分配情况
static char* _S_start_free;
static char* _S_end_free;
static size_t _S_heap_size;
template <bool __threads, int __inst>
char* __default_alloc_template<__threads, __inst>::_S_start_free = 0;
template <bool __threads, int __inst>
char* __default_alloc_template<__threads, __inst>::_S_end_free = 0;
template <bool __threads, int __inst>
size_t __default_alloc_template<__threads, __inst>::_S_heap_size = 0;
重要的辅助接口函数
// 将 __bytes 上调至最邻近的 8 的倍数
static size_t _S_round_up(size_t __bytes)
{ return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1)); }
// 返回 __bytes 大小的chunk块位于 free-list 中的编号
static size_t _S_freelist_index(size_t __bytes) {
return (((__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN - 1); }