标题前的数字(如 “2.1 空间配置器的标准接口”中的数字 2.1 )代表在《STL源码剖析》一书中的章节号。
“字典”:
ptrdiff_t
ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型。ptrdiff_t类型变量通常用来保存两个指针减法操作的结果。ptrdiff_t定义在stddef.h(cstddef)这个头文件内。ptrdiff_t通常被定义为long int类型。
set_new_handler(x)
在利用operator new请求内存分配失败的时候,在抛出异常之前,会调用一个回调函数给程序员一个机会去处理内存分配失败的情况。x 代表的是一个函数指针,指向程序员自己定义的用户处理内存分配失败时候的函数。在这段代码中将 x 设置为nullptr或者0表示程序员放弃这个处理机会,直接抛出bad_alloc异常。
::operator new , ::operator delete
当我们在C++中使用new 和delete时,其实执行的是全局的 ::operator new 和 ::operator delete , :: 前不加命名空间则表示最外层的默认的命名空间。
new( p ) T1(value);
就是在指针p所指向的内存空间创建一个T1类型的对象,但是对象的内容是从T2类型的对象转换过来的,就是在已有空间的基础上重新调整分配的空间。这个操作就是把已有的空间当成一个缓冲区来使用,这样就减少了分配空间所耗费的时间,因为直接用new操作符分配内存的话,在堆中查找足够大的剩余空间速度是比较慢的。
inline 内联函数
使用内联函数可以避免函数调用的开销,当调用一个函数时,除了函数执行语句的开销外,还有很多其他的开销,如拷贝形参、返回时恢复等等,使用内联函数时,程序并不会执行“调用”,而是相当于把函数内的语句在此处抄了一遍,执行单纯的语句比执行函数的速度要快一些,因此使用内联函数可以避免函数调用的开销。
注释:



主要是针对对象的构造和析构,在对象构造前,内存已经分配了,在对象析构后,内存才会被释放。
trivial destructor
如果用户不定义析构函数,而是用系统自带的,则说明,析构函数基本没有什么用(但默认会被调用)我们称之为trivial destructor。反之,如果特定定义了析构函数,则说明需要在释放空间之前做一些事情,则这个析构函数称为non-trivial destructor。
size_t
size_t的全称是size_type,用来表示某种类型的大小、字节数,size_t是一种记录大小的数据类型。
空间的配置与释放的设计哲学:
C++内存配置的基本操作 ::operator new() (全局函数)
C++内存释放的基本操作 ::operator delete()(全局函数)
它们的底层使用的是C语言的malloc()函数和free()函数完成的内存空间的配置与释放
SGI的双层级设置器(为了解决碎片空间问题):
第一级配置器(__malloc_alloc_template):直接使用 malloc() 和 free() 函数进行分配空间和释放空间
第二级配置器(__default_alloc_template):针对碎片空间采用memory pool的整理方法
使用策略:当配置区块超过128kb时,视为空间足够大,直接采用第一级配置器;否则采用第二级配置器。


