SGI STL内存配置器分析
stl的容器利用缺省的Alloc参数为自己分配内存,Alloc就是stl的空间配置器,用于空间的管理
1 | template <class T, class Alloc = alloc> |
空间配置器由内存池,链表来具体实现对空间的分配、回收和管理
在一个对象的创建和销毁时(new
和delete
),各需要经历了两个步骤
创建
- 分配空间
- 用构造函数构造对象
销毁
- 析构
- 释放空间
注意区分::operator new
和placement new
进一步抽象,就像房子和内部物体结构,同样可以在上面的步骤中,将空间管理和具体结构管理分开
见框架图
构造:调用placement new
在指定的位置上设定初值
析构:析构指定位置的东西
空间的管理
使用一块内存而不加管理会导致很多问题,诸如向系统堆栈(system heap)请求空间,内存不足,内存碎片等
针对内存碎片,有双层级配置器
对于内存不足和请求system heap,有内存池(memory pool)
为什么不只用一级配置器,malloc似乎也可以分配小空间?
防止过多的额外负担(overhead),每向系统申请一块内存,就有一部分其他的空间被系统拿来管理我们申请的那片内存,申请内存越小,系统管理所用空间占比就越大,举例就是去离家很近的地方,选择走路而不是开车,走路不用花钱,开车却有一定的花费,这个花费对这点距离来说没有必要,但是出远门,开车肯定比走路好,这些花费是必要的
总结做了一个框架图来展示SGI alloc的实现
https://fl0.top/2021/12/11/SGI%20STL%E5%86%85%E5%AD%98%E9%85%8D%E7%BD%AE%E5%99%A8%E5%88%86%E6%9E%90/
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.