空间配置器

set_new_handler : 设置new空间失败的一些处理,他接收一个函数指针作为参数,其类型为:

typedef void (*new_handler)

new (p) T1(value) :  在p所指向的内存空间构造T1类型的对象,并调用构造函数T1(value).


1. SGI 空间配置器, std::alloc

STL 内存配置操作由alloc::allocate()负责,内存释放操作由alloc::deallocate()负责;对象构造由::construct()负责,对象析构操作由::destroy()负责。

空间配置器_第1张图片

2.  construct() & destroy()

construct()接收一个指针p和一个初值value, 该函数的用途是将初值设定到指针所指的空间上。

destroy()有两个版本,第一版本接收一个指针,准备将指针所指之物析构掉;第二版本接受first和last两个迭代器,准备将[first, last)范围内的所有对象析构掉,但如果每次调用的都是无关紧要的函数则是对效率的一种消耗。因此,利用value_type()获得迭代器所指对象的类型,再利用__type_traits<T>判断该类型的析构函数是否无关紧要。若是(__false_type),则什么也不做;若不是(__false_type),才循环调用第一版本的destroy().


3. 第一级与第二级配置器

SGI STL 第一级配置器                            

template<int inst>

class __malloc_alloc_template {...};

1. allocate()直接使用malloc(), deallocate()直接使用free().

2. 模拟C++的set_new_handler()以处理内存不足的情况


SGI STL 第二级配置器

template <bool threads, int inst>

class __default_alloc_template {...};

1. 维护16个自由链表(free lists),负责16种小型区块的次配置能力。内存池以malloc()分配得到。如果内存不足,则调用第一级配置器的new失败的处理程序。

2. 如果需求区块大于128字节,则转调用第一级配置器。

你可能感兴趣的:(空间配置器)