空间配置器
- 空间配置器的必要接口
allocator::rebind | 嵌套的class template,唯一成员other,代表allocator<U> |
allocator::allocator | 默认构造 |
allocator::allocator(const allocator&) | 拷贝构造 |
template<class U>allcotor::alocator(const allocator<U>&) | 泛化的拷贝构造 |
allocator::~allocator | 析构 |
Pointer allocator::address(reference x) const | 返回某个对象的地址 a.address(x) 等同于&x |
Pointer allocator::allocator(size_type n, cosnt void * = 0) | 配置空间,足以存储n个T对象 |
void allocator::deallocate(Pointer p, size_type n) | 还原先前的配置空间 |
size_type allocatoe::max_szie() const | 返回可成功配置的最大量 |
void allocator::construct(Pointer p, const T &x) | 等同于 new((const void*))p T(x) |
void allocator::destory(Pointer p) | 等同于 p->T() |
- 9.29
(1)ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型。ptrdiff_t类型变量通常用来保存两个指针减法操作的结果。// ptrdiff_t 在stddef.h中定义,是一个signed 的类型
(2)
对于函数 set_new_handler函数的作用是设置new_p指向的函数为new操作或new[]操作失败时调用的处理函数。
(3)#ifndef/#define/#endif的作用
在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量"重定义"的错误。在头文件中实用#ifndef #define #endif能避免头文件的重定义。
- 9.30
(1)trivial destrutor
如果用户不自定义析构函数,系统自带的,说明这个析构函数没什么作用,但会被自动调用,被称为trivial destrutor,相反,如果用户定义了析构函数,被称为 non_trivial destrutor, 如果这个类里只有基本类型,没必要调用(写)析构函数,如果类中有个指向其它的指针,并且在构造中分配了内存空间,就必须释放这块,否则会内存泄漏。STL 有一个 has_trivial_destructor函数 用来检测。
(2)static 函数
静态函数有两种
一种是静态成员函数,出现在类里
调用这个函数不会访问或修改任何对象(非static)数据成员
全局静态函数不能被其他文件所用
- 10.1
配置器理解
一个obj * freelist[16]
管理大小分别为
8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128
freelist 实现技巧:
obj 使用union,obj 可被视为一个指针,指向相同形式的另一个obj。也可以被视为指针,指向实际区块。
申请bytes大小的内存,首先将bytes调整至8的倍数,再根据大小计算使用n号freelist
使用了 n 号list之后,把 free_list[index]调整到指向下一区块
如果当前freelist 没有区块了 用 refill 申请
refill 的原理使用chunk申请20个(可能少于)内存块,一一配置到相应freelist的节点里
chunk原理 从内存池中取块(因为内存池一开始是0,会用malloc向heap申请)
四种情况:
(1)可以申请 20 * bytes 返回首地址,修改内存池的大小(把起始地址改了)
(2)可以申请小于 20*bytes 大于1 也返回首地址,并修改 nobjs,修改内存池大小
(3)不能申请1 bytes数量的内存,将剩余一点内存编入,用malloc申请
(4)malloc申请失败 山穷水尽。。。我选择死亡
- 10.13
进度缓慢
理解空间配置器之后,就是迭代器
为了推导迭代器的型别和特性,做了很多内嵌typedef
根据STL标准,有五种iterator
推导思路:
利用泛型编程的参数推导机制
用到这五种特性时自动转换为传入的泛型参数
多嵌套一层因为无法推导返回值类型
之后是原生指针的特化版本
返回值是 iterator_traits 参数是<iterator>的类成员 iterator_category, 就可以根据It 的实际类型推导

浙公网安备 33010602011771号