STL 源码分析第二章: 空间配置器理解

来源:互联网 发布:信息流优化师招聘 编辑:程序博客网 时间:2024/05/16 09:46

本文及后面相关文章看STL 源码剖析以后自己的理解,没有侵权的意思,其中有些话是引用上面的内容,写的不是很好,方便以后自己想复习的时候翻看。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 SGISTL之空间配置

   个人觉得这章主要讲了在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个不同的区块8128

  内存池中分三种情况内存池剩余的空间完全满足需求量,剩余空间不能满足需求量,但足够一个以上的区块,剩余空间连一个区块的大小都无法提供,则使用heap空间配置malloc为原来的2倍。



0 0
原创粉丝点击