stl读书笔记(1)-内存分配

来源:互联网 发布:怎么开发app软件 编辑:程序博客网 时间:2024/06/05 21:54

现在主流使用的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]链表里面获取内存。

释放内存类似处理。




0 0
原创粉丝点击