本文解说SGI STL空间配置器的第二级配置器. 相比第一级配置器,第二级配置器多了一些机制,避免小额区块造成内存的碎片.不不过碎片的问题,配置时的额外负担也是一个大问题.由于区块越小,额外负担所占的比例就越大. 额外负担是指动态分配内存块的时候,位于其头部的额外信息.包含记录内存块大小的信息以及内存保护区(推断是否越界).要想了解具体信息,请參考MSVC或者其它malloc实现. SGI STL第二级配置器详细实现思想 例如以下: 假设要分配的区块大于128bytes,则移交给第一级配置器处理…
SGI STL考虑到小型内存区块的碎片问题,设计了双层级配置器,第一级配置直接使用malloc()和free():第二级配置器则视情况采用不同的策略,当配置区大于128bytes时,直接调用第一级配置器:当配置区块小于128bytes时,遍不借助第一级配置器,而使用一个memory pool来实现.究竟是使用第一级配置器还是第二级配置器,由一个宏定义来控制.SGI中默认使用第二级配置器. 第一级配置器实现的比较简单,调用malloc()申请内存,申请失败的时候,将抛出bad_alloc异常.下边…
本文大致对STL中的空间配置器进行一个简单的讲解,由于只是一篇博客类型的文章,无法将源码表现到面面俱到,所以真正感兴趣的码农们可以从源码中或者<STL源码剖析>仔细了解一下. 1,为什么STL要专门写一个空间配置器管理空间的分配和释放,不能直接使用Malloc吗? ⑴ 我们如果频繁的进行一些小空间的申请与释放,加入先申请10个字节的空间,然后每隔一个4字节,将其释放,那后面如果要再次申请比4个字节大的空间,那毫无疑问,前面已经被释放的是无法使用的.->内存碎片问题 ⑵ 我们都知道mall…
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的框架,如果发现有雷同,请勿见怪,这篇文章只是我的个人记录,算不上原创,只是更多的想把概念描述清楚,所以如果您觉得有copy之嫌的话请绕道看您觉得的原链接.在第8部分给出了笔记的参考链接.   1.allocator 作用 STL的组件(容器)都需要配置空间以放置资料.这个就是allocator的作用…
前言 在STL中,容器的定义中都带一个模板参数,如vector template <class T, class Alloc = alloc> class vector {...} 其中第二个参数就是该容器使用的空间配置器,其中缺省使用STL已经实现的空间配置器(alloc), 该配置器使用malloc/free等为vector分配内存. 缺省的空间配置器 alloc定义了两级的空间配置器,第一级是对malloc/free简单的封装. 而为了解决内存碎片的问题,跟进行内存管理,alloc实现的…
在前面很多随笔里都有提到new对象是先分配内存然后初始化对象,主要是对operator new和placement new的使用 在SGI STL中内存的分配和初始化是分开的,分配内存是使用类模板,模板参数是非类型模板参数,<int inst>不过完全没有派上用场. 当内存大于128byte时使用第一级空间配置器,当内存小于128byte时使用第二级空间配置器. 对象的构造和析构是使用全局对象.…
new运算包含两阶段操作: 1) 调用::operator new分配内存     2) 调用构造函数构造对象内容 delete运算包含两阶段操作: 1)调用析构函数将对象析构    2)调用::operator delete释放内存 stl内存配置操作由allocate()负责,内存释放操作由deallocate()负责:对象构造操作由construct()负责,对象析构操作由destroy()负责. template <class T1, class T2> inline void con…
第一级空间配置器 第一级配置以malloc(), free(), realloc()等c函数执行实际的内存配置,释放.重配置操作,并实现出类似c++ new handler的机制.它不能直接使用c++ new handler机制,因为它并非使用::operator new来配置内存. 所谓的c++ new handler机制,就是你可以要求系统在内存配置需求无法被满足时,调用一个你所指定的函数.换句话说,一旦::operator new无法完成任务,在丢出std::bad_alloc异常状态之前…
前不久把STL细看了一遍,由于看得太"认真",忘了做笔记,归纳和总结这步漏掉了.于是为了加深印象,打算重看一遍,并记录下来里面的一些实现细节.方便以后能较好的复习它. 以前在项目中运用STL一般都不会涉及到空间配置器,可是,在STL的实现中,空间配置器是重中之重,因为整个STL的操作对象都存放在容器之内,而容器一定需要配置空间以置放资料.所以,在阅读STL源码时,最先需要掌握的就是空间配置器,没了它,容器,算法怎么存在? C++ STL的空间配置器将内存的配置.释放和对象的构造和析构分…
目录 问题 SGI版本空间配置器-std::alloc 一级空间配置器 二级空间配置器 Refill.chunkAlloc函数 最后,配置器封装的simple_alloc接口 问题 我们在日常编写C++程序时,常常会用到我们的STL标准库来帮助我们解决问题,这当中我们用得最多估计就是它里面的vector.list容器了,它们带来的便利不用多说(毕竟OJ.刷题什么的,基本全是它们的身影),而在日常学习中我们对STL中另一大组件-空间配置器 了解可能就相对较少了.不过它也是个有用的东西,之所以这么说…