STL(6) 分配器
- operator new()和malloc()
- allocator
- VC6的标准库如下
- 直接使用allocate
- BC5的库
- 直接使用allocate
- GNU C 2.9
- 三种allocate的问题
- VC6的标准库如下
- alloc G2.9 STL
- allocator G4.9
不直接使用,是幕后英雄,选择合适的分配器可以提高效率
operator new()和malloc()
operator new()在最底层会调用malloc()
右边是所有分配的内存,其中size占有一部分,会附加许多其他的overhead内存
allocator
VC6的标准库如下
直接使用allocate
allocator类中的allocate函数,调用new 和delete 最后调用malloc
没有任何特殊设计
一个typename后面直接加一个小括号,就是一个临时对象,通过object就可以调用有关函数
释放时需要制定大小
BC5的库
直接使用allocate
同理,不过不需要指定void * 大小,有一个默认值
GNU C 2.9
GNU C下有如下注释,不要使用这个文件,这个文件没有被引用到任何其他的文件中
三种allocate的问题
如果一个容器中有100w个元素,这些元素本身自己的size是很小的,然而每一个元素都有一个overhead,就会造成开销很大,浪费空间
所以,真实的实现中,没用这些allocator
alloc G2.9 STL
主要诉求:减少malloc的次数,因为每一次malloc都会产生一次额外开销
红色部分称为cookie,记录了这一段内存的大小
而在容器中,每一块都是由固定的大小,就不需要cookie
每一个链表用于维护不同的byte大小,#0 负责81 #1 负责82byte的大小
所有不足的都被调整到相应的大小,例如来了一个50byte的大小,发现其为56的大小,就分配到#6链表之下
当内存不足,分配器就向系统要一大块内存
可以减少cookie的使用(图中绿色的为cookie)
allocator G4.9
容器分配器重回allocator
allocator继承new allocator
new_allocator中 allocate调用new deallocate调用 delete
没有任何特殊设计,侯捷也不懂
G4.9中的附加库,其中__pool_alloc就是G2.9的alloc