STL空间配置器
1.STL配置器是指配置一些资源,如内存,磁盘资源等。
2.STL空间配置器是为了给常用的容器来进行空间上的配置,这个空间可以是内存,可以是磁盘或是其他的辅助存储介质。
3.下面简单介绍一下
1. <stl_construct.h>
a. 其定义consruct和destroy的大致代码可以参考STL源码剖析这本书。
b. 他在对类型进行析构的函式也是用到了类型萃取,特化等,这个内容可以看前面的博客。
c. 他对析构函数进行了多个版本的实现,在第二个版本中将一段区间进行析构,为了效率,stl中加入了类型萃取,使其的析构更加高效。因为对于一些无关痛痒的类型一次一次的调用析构无疑是对效率的伤害,也是违背了STL设计初衷啊。所以对于无关痛痒的类型直接不管,否则就进行循环的将这段区间的对象进行逐个析构。
2.<std_alloc.h>
a. 这里是定义了一级和二级的空间配置器。
b. 它是用对内存空间进行配置和释放的。
c. 为了考虑内存碎片的问题,STL采用二级的进行配置,当申请内存空间大于128byte时直接调用一级配置器,否则怎采用内存池加自由链表即二级配置器进行内存的分配。
3.<stl_alloc.h>
a. 一级空间配置器
b.二级空间配置器
free_list
![]()
1.自由链表就是有16大小为8倍数的大小的链表,每个下面都挂着相同大小的内存,当然只是为了看起来形象,其实真实的内存不是这样的。
2. 当你申请的大小不为8倍数时,则会向上取一个8的倍数来进行分配
3. 当被用户申请走的空间也就不挂在对应的位置了,被剔除出去了
内存池(memory pool)
1. 内存池就是一块相对而言比较大的内存空间
2. 内存池主要是用来补充free_list的空间的。(chunk_alloc来进行分配)
3. 当内存池的容量足以满足申请的空间大小,直接返回20块,一块直接给其使用,另外19块挂在free_list上。
4. 如果内存池不足以分配20块,那么就返回能够返回的数量。
5. 如果内存池连一块空间都不够,那么就会从系统中malloc两倍的申请空间大小(40),一块直接交给使用,19块挂在free_list上,剩余20块放到内存池中。
6. 假如此时系统也没有足够大小的空间进行分配,那么chunk_alloc就会四处寻找空间,一道找到了就会立刻交付。如chunk_alloc没有找到,那么就会启动一级配置器,他也是调用malloc,但是malloc不成功时它将调用set_new_handler机制,进行更深的挖掘。
总结:空间配置器虽然一定程度上解决了内存碎片的问题,但是这个问题解决只是在一定程度上的,并没有完全解决,或者说只有在一定的条件下才可以很好的解决,即将一些小型的内存块进行了有效的管理,但是与此同时也引入了内碎片的问题,例如当申请3byte,却只能分配给8byte,这无疑也是更小的碎片。
以上都是参考STL源码解析,如有错误,可以私信我,这里表示感谢!