现在主流使用的stl分为很多版本,基本上尊重stl业界统一标准。我们使用的是sgi_stl。侯杰在《stl源码剖析》这本书中说明stl的六大组件:
具体结构我不想细说,主要想说一下空间分配器(allocator)。这个是stl各个组件的基础。stl的类模板参数一般都会有个参数指定空间分配类。例如:
template<class T, class Alloc=alloc>
class vector{
....
};
allocator实现位于stl_alloc.h中,真正使用的是_default_alloc_tempalte。如图:
、
通过调用allocate()和deallocate()“申请”,“释放”内存
__default_alloc_template的内存分配分两种情况处理:
1:当申请的内存size >_MAX_BYTES则直接,直接malloc申请
2:当申请的内存size <= _MAX_BYTES,采用内存池机制
截图所指的就是内存池表s_free_list,为了快速的申请内存。以8为倍数进行申请。函数_S_freelist_index()返回内存s_free_list索引。这里说一下_Obj对象,_Obj是一个联合对象:
_M_free_list_link:指向下一个节点指针。
M_client_data[1]:这个暂时没有搞清楚,我感觉这个是没有用的。
内存池布局结构
|####################|
|M_free_list_link[0] |-------->[8BYTES]------->[8BYTES]---------->[8BYTES]
|---------------------------------|
|M_free_list_link[1] |
|---------------------------------|
|M_free_list_link[2] |
|---------------------------------|
|M_free_list_link[3] |
|####################|
例子:
1:申请500bytes内存
2:申请120个字节内存,根据上面的机制。从内存池中去拿去内存。定位索引为16(128/8),M_free_list_link[16]链表里面获取内存。
释放内存类似处理。