本文及后面相关文章看STL 源码剖析以后自己的理解,没有侵权的意思,其中有些话是引用上面的内容,写的不是很好,方便以后自己想复习的时候翻看。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SGI版STL之空间配置:
个人觉得这章主要讲了在C++中STL关于内存如何获取与分配的机制,后面将会总结一下。
其中了解了STL中关于构造函数的实现:
下面的几个模块都在STL allocator类中,使用时需要自己定义;
#include<allocator>
allocator<int> alloc;
void construct (T1*p,const T2&value)
{
new(p) T1 (value);
}
void destroy(T*pointer)
{
Pointer->~T();//显示调用析构函数,我看C++ primer是这样解释的
} 还有第二个版本
allocate(size_t n) 在VC中必须是两个参数,第二个就写NULL;
deallocate(void*p,size_t n);
下面就是关于比较细一点的内存分配:
关于空间的申请如果大于128个字节,则使用malloc申请,也就是第一级配置器,释放使用free,相对而言比较简单,其中有一个要客户自己定义的一个handle,如果申请失败会怎么办,反复申请,使用死循环,成功则返回。
比较烦的是小于128字节时:使用第二级配置器,如果有可以区块就调用free list,否则会把申请的空间变为8的倍数,当然是大于申请的空间,其中主要有refill( ),chunk_alloc( )两个函数比较重要,这里其实主要讲了关于内存池如何空间的分配,一开始是默认使用一个区块后面有20个相同大小区块,每个区块的大小有一开始调用的refill来决定,区块使用的是union结构来管理各个区块的指向,一个有16个不同的区块8—128。
内存池中分三种情况: 内存池剩余的空间完全满足需求量,剩余空间不能满足需求量,但足够一个以上的区块,剩余空间连一个区块的大小都无法提供,则使用heap空间配置malloc为原来的2倍。