一、STL概论
1、临时对象的使用
刻意制造临时对象的方法,在型别名称之后直接加一堆小括号,并指定初值。如int(8)、vector等。
2、迭代器使用前闭后开区间表示法
3、仿函数的使用
- 仿函数可以起到取代函数指针的作用。函数指针的缺点是无法持有自己的状态,也无法达到组件技术中的可适配性,也就是无法再将某些修饰条件加诸于其上而改变其状态。
- 所谓的仿函数就是使用起来想函数一样的东西。如果针对某个class进行operator()重载,它就成为一个仿函数。
二、空间适配器
空间适配器主要用于容器的空间配置。如:vector<class T, class alloc >,默认的空间适配器为std::alloc
1、C++内存配置操作和释放操作
- new算式包含两个阶段:(1)调用::operator new配置内存;(2)调用构造函数构建对象内存。
- delete算式包含两个阶段:(1)调用析构函数将对象析构;(2)调用::operator delete释放内存。
2、构造和析构的基本工具:construct()和destory()
3、空间的配置和释放
双层配置器:第一级配置器直接使用malloc()和free();第二级配置器则视情况采用不同的策略:当配置区块超过128bytes时,设置为足够大,便调用第一级配置器;当配置区块小于128bytes时,使用复杂的memory pool方式。
4、第二级配置器小内存配置方式
- 维护16个free-lists链表,分别存储8-128bytes的8的倍数的空闲内存区,进行空间的分配。有内存需求时则从链表里拨出,如果释放小额区块,则会受到链表中。
- 如果链表某个大小的空间不够,则调用refill函数重新获得空间,其中通过chunk_alloc函数从内存池中进行内存申请。该函数首先判断内存池是否充足,充足则直接提供内存;如果不足提供所有的区块,但足够供应一个以上的区块,则拨出尽可能多的区块;如果一个区块都无法供应,就利用malloc从堆中配置内存;如果仍失败,就从区块大的free-lists中找内存分出;找不到就智能调用第一级配置器;第一级配置器其实也是使用malloc配置内存,担忧out-of-memory处理机制,如果可以就成功,否则发出bad_alloc异常。
5、内存基本处理工具
- 主要包括:construct、destory、uninitialized_copy、uninitialized_fill、uninitialized_filln。
- 后三者分别对应高层次函数copy、fill、filln(都是STL算法),底层主要分两种方式:首先判断迭代器的value_type是否为POD(plain old data,包括标量型别或传统的C struct型别)类别:如果是就采用最有效率的系统默认初值填写手法(trival ctor/dtor/copy/assignment函数);否则采取最安全的底层迭代法。
6、set_new_hander(new_hander, new_p)
指向的函数new_hander为new操作和new[]失败时调用的处理函数。
7、placement new操作
如new( p) T1(value),在指针所指向的内存空间创建一个T1类型的对象,但对象的内容是T2类型的对象value转换而来的。