allocator

allocator:

通常c++内存配置和释放操作是这样的:

class Fo{};
Fo *p = new Fo;
delete p;

new算式主要有三个阶段:

  • 调用::operator new配置内存
  • 调用Fo::Fo()构造函数
  • 返回一个对象的指针

allocator为了精密分工将步骤分开
1.allocate()和deallocatr()负责内存的配置和释放
2.construct()和destroy()负责对象的构造和析构

  • pointer->~T() 和 new(p) T1(value) 定位new

空间配置和释放

第一级:通过malloc、realloc和free。(::operator new无法可能是C++未有realloc这种内存重置函数)
第二级:为了避免小额区块造成的内存碎片,用freelist管理小额区块
如果大于128kb就用第一级


freelist:

union可以有多个数据成员,但是任意时刻只能有一个生效。共享内存,所以有时需要定位new。
如果用其来实现链表,那么分配的内存既能用做指针,(不使用时)又能用做实际内容.

union obj{
union obj *free_list_link;
char clent_data[1]; /* the client sees this */
};

一些内存处理工具

uninitialized_copy();
uninitialized_fill();
uninitialized_fill_n();

都能将内存的配置和对象的构造行为分离开来
如果范围内每个迭代器都是未初始化的,会construct产生对象。


参考:
Effecti STL

posted @ 2017-03-20 18:48  Przz  阅读(231)  评论(0编辑  收藏  举报