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()负责。
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字节,则转调用第一级配置器。