您的位置:首页 > 其它

《STL源码剖析》读书笔记二--空间配置器

2014-07-25 10:20 441 查看
STL通过空间配置器为容器配置内存,它负责容器存储空间的分配、回收等一系列内存操作。统一的内存管理使得STL库的效率得到极大地提升。

一、 构造和析构基本工具:Construct() 和Destory()



由上图可知,析构函数更加复杂,既有泛化,又有特化,no-op表示没有操作,destory()函数的第一个版本接受两个迭代器为参数:first和last,若迭代器范围内的对象的析构函数不是很重要,通过函数:has_trivial_destructor,即trival destructor。若存在(__true_type),则无操作;若不是的(__false_type),则需要巡防整个迭代器的范围,调用第四个版本的destory();



二、 空间的配置与释放 alloc

使用双层级配置器,第一级配置器,直接使用malloc()和free()进行内存分配和回收;第二级配置器则视情况采用不同的策略:当配置区块超过128 bytes时,调用第一级配置器,若配置区块小于128 bytes时,采用链表和内存池管理。



自由链表free_list有16个结点,每个结点管理大小为8,16,
24……120,128 bytes的区块链表,分配内存时,首先根据需要的区块大小,查找对应的free_list结点所管理的区块链表,若有,则从区块链表中取出一块,将首地址返回;若无,则需要通过refill()函数,通过内存池为free_list重新填充空间。内存池申请空间时,存在三种情况:1、内存池空间足够20个所需区块大小;2、内存空间足够一个及以上的区块;3、内存池空间不足一个所需区块大小,此时先将内存池零散的空间放入free_list结点中,然后向head申请空间,使用malloc函数,如果还无法获取内存空间,则调用第一级配置器。

三、 内存基本处理工具:uninitialized_copy/fill/fill_n

这几个函数都用来初始化内存的值,均要求执行过程的原子性,要么全部执行完,要么不执行(部分执行则要求回滚)。函数执行中均首先获取所赋值参数的类型,然后利用is_POD_type()来判断该类型是否为Plain Old Data,对于该类型数据,可以采用最有效率的初值填写手法,而对于non-POD型采用最保险安全的做法,即逐个遍历调用构造函数,进行赋值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: