本文是对STL源码解析第二章的学习总结,不足之处,欢迎批评指出。
1、SGI标准的空间配置器,std::allocator
虽然SGI也定义了一个部分标准的,名为allocator的配置器,但SGI自己从未使用过,主要原因是效率不佳。它只是将c++的operator new和operator delete做一层薄薄的封装而已。注意operator new只负责内存分配,而new还要复制构造。实际上new和delete都有两个操作过程:(1)利用operator new配置内存(2)调用构造函数构造对象内容。delete也类似。
2、SGI采用的特殊配置器,std::alloc
为了精密分工,STL分配器将上述两个阶段分开来。其中内存配置使用alloc::allocate()以及alloc::deallocate()负责,对象构造由::construct()负责,对象释放有::destroy()负责。
::construct和::destroy()放置在stl_construct.h中,内存配置则放在stl_alloc.h当中。
还有一点需要注意的是,在stl_uninitialzed.h中定义了一些全局函数,用来填充或者拷贝大块内存数据。
3、构造和析构基本工具:construct和destroy
构造函数使用placement new(在已经分配好的空间上构造对象,)实现,而析构函数则需要分不同进行讨论。
(1)如果元素的数值类型有trivial destructor(无关紧要的析构器),如果是,则什么都不做就可以结束了。
(2)如果否,那么调用对应的析构函数。
4、空间(内存)的配置和释放
c++的内存配置操作(无构造)使用::operator new和::operator delete完成,相当于c中的malloc和free函数。因此,SGI使用malloc()和free()完成内存的配置和释放。
考虑到内存破碎问题,SGI设计了双层级配置器,第一层直接使用malloc()和free()——当内存分配大于128bytes,否则使用第二级配置器。
STL第一级配置器的特点:
(1)allocate()使用malloc(),deallocate()使用free()
(2)模拟了c++中的set_new_handle()以处理内存不足的情况。
STL第二级配置器的特点:
(1)维护16个自由链表,每个链表默认为20个大小相同的小块。16个自由链表指向的小块区域都是8的倍数。
(2)如果大于128bytes,就转调用第一级配置器。
具体理解,强烈推荐查看源码进行理解。