文章目录
STL
的实现有多个版本,其中
SGI
被
GCC
所采用。
SGI
属于
open source
的一员,但不属于
GNU GPL
。
SGI
STL
的配置器的名称是alloc
,每一个容器的实现都指定了其缺省的空间配置器为alloc
。alloc
不接受任何模版型别参数。
template <class T, class Alloc = alloc>
class vector { ... };
C++
的内存配置(申请)的基本操作是::operator new()
,内存释放的基本操作是::operator delete()
。这两个全局函数相当于C
的malloc()
和free()
。
两级配置器
考虑到小型区块所可能造成的内存碎片问题,SGI
设计了双层级配置器。
第一级配置器直接使用malloc
和free
。
第二级配置器视情况采用不同的策略:当配置区块大于128
字节时,便调用第一级配置器;当配置区块小于128
字节时,便采用memory pool
管理内存。使用内存池管理时,每次配置一大块内存,并维护对应的自由链表free-list
。下次若再有相同大小的内存需求,就直接从free-list
中取出,如果释放了小区块内存,就由配置器回收到free-list
中。为了方便管理,第二级配置器会主动将任何小额区块的内存需求量上调至8的倍数。
在SGI
的实现中,把alloc
用作第一级配置器还是第二级配置器取决于是否定义__USE_MALLOC
#ifdef __USE_MALLOC
typedef __malloc_alloc_template<0> malloc_alloc;
typedef malloc_alloc alloc; // alloc作为第一级配置器,使用malloc配置内存
#else
typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0> alloc; // alloc作为第二级配置器
#endif