stl的容器利用缺省的Alloc参数为自己分配内存,Alloc就是stl的空间配置器,用于空间的管理

1
2
template <class T, class Alloc = alloc>
class vector {}

空间配置器由内存池链表来具体实现对空间的分配回收管理


在一个对象的创建和销毁时(newdelete),各需要经历了两个步骤

创建

  • 分配空间
  • 用构造函数构造对象

销毁

  • 析构
  • 释放空间

注意区分::operator newplacement new


进一步抽象,就像房子和内部物体结构,同样可以在上面的步骤中,将空间管理和具体结构管理分开

见框架图


构造:调用placement new在指定的位置上设定初值

析构:析构指定位置的东西


空间的管理

使用一块内存而不加管理会导致很多问题,诸如向系统堆栈(system heap)请求空间,内存不足,内存碎片等

针对内存碎片,有双层级配置器

对于内存不足和请求system heap,有内存池(memory pool)


为什么不只用一级配置器,malloc似乎也可以分配小空间?

防止过多的额外负担(overhead),每向系统申请一块内存,就有一部分其他的空间被系统拿来管理我们申请的那片内存,申请内存越小,系统管理所用空间占比就越大,举例就是去离家很近的地方,选择走路而不是开车,走路不用花钱,开车却有一定的花费,这个花费对这点距离来说没有必要,但是出远门,开车肯定比走路好,这些花费是必要的


总结做了一个框架图来展示SGI alloc的实现

关系图