STL(6) 分配器

发布时间 2023-09-06 15:59:03作者: LiviaYu


不直接使用,是幕后英雄,选择合适的分配器可以提高效率

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