一、 空间配置器
用alloc文件,用于分配和回收内存,以内存池的方式实现。
采用链表的方式管理内存碎片,分配与回收小内存(<=4K)区块。我们用联合体union来维护链表,从其第一个字段观之可以视为一个指针,指向下一个区块;从其第二个字段观之是存有本块内存首地址。且联合体的大小是其中最长对象的大小,因此使用联合体就解决了为维护链表而造成的内存浪费。
// 共用体: FreeList
// 采用链表的方式管理内存碎片,分配与回收小内存(<=4K)区块
union FreeList {
union FreeList* next; // 指向下一个区块
char data[1]; // 储存本块内存的首地址
};
本空间配置器也采用二级配置器:
(1) 如果内存较大超过4096 bytes,直接调用 std::malloc, std::free
(2) 当内存较小时,以内存池进行管理,每次配置一大块内存,并维护对应的自由链表。
源码:
包括了 allocator 和 constructor,分别定义在 allocator.h 和 construct.h 中。
allocator 负责空间的配置与回收,定义了一个类 mystl::alloc 用于管理内存,定义在 alloc.h 。
constructor 负责对象的构造与析构,对应两个全局函数: construct 和 destroy。
源码资源