提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
前面介绍了为什么要使用空间配置器,以及在STL源码中,构造函数和析构函数的实现形式。参考博文:空间适配器allocator(一)
接下来介绍,STL源码中如何配置内存空间。
一、空间的配置
C++中的内存分配都是调用::operator new 和 ::operator delete,其本质上还是调用的malloc和free。对于malloc来说,如果分配的内存空间很小,那么额外开销占比太大(比如cookie等额外开销)。为了避免这种额外开销,在SGI版本的STL中,采用两级分配器。
(1)分配很大(>128bytes)的内存空间时,采用的是一级配置器,即采用malloc进行内存分配。
(2)分配很小(<128bytes)的内存空间时,采用的是二级配置器。采用内存池的方式进行内存配置。
STL中通过宏 __USE_MALLOC 是否被定义判断只开放第一级配置器,或是同时开放第二级配置器。
#ifdef __USE__MALLOC //如果定义了__USE__MALLOC
...
typedef __malloc_alloc_template<0> malloc_alloc; //一级空间配置器
typedef malloc_alloc alloc;
#else //如果没有定义__USE__MALLOC
...
//令alloc为第二级空间配置器
typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS,0> alloc;
#endif
//alloc并不接受任何template参数
为了能够满足STL标准规范,对一级配置器和二级配置又包装了一层。(对外无感知有两种不同的空间配置器)
template<class T, class Alloc>
class simple_alloc{
public:
static T* allocator(size_t n){
return 0==n? 0:(T*)Alloc::allocate(n * sizeof(T));
}
static T* allocator(void){
return (T*)Alloc::allocate(sizeof(T));