本文根据《侯捷–c++内存管理》一课进行学习总结:
allocator的演变
- 第一个版本是我们自己在类里面进行内存申请,先申请一大块chunk大小的内存空间,再用链表将chunk中切成块,每一块是一个screenChunk=24的大小,用linked list的方式进行连接。
- 第二个版本和第一个版本类似,区别就是使用了union,并用一个*next作为头指针(指向第二块作为开始)。
- 第三个版本,将内存分配封装起来,由allocator统一分配处理。
// 第三个版本
class allocator {
private:
struct obj {
struct obj* next; //embedded pointer
};
public:
void* allocate(size_t);
void deallocate(void*, size_t);
void check();
private:
obj* freeStore = nullptr;
const int CHUNK = 5; //小一點方便觀察
};
void* allocator::allocate(size_t size){
obj* p;
if (!freeStore) {
//linked list 是空的,所以攫取一大塊 memory
size_t chunk = CHUNK * size;
freeStore = p = (obj*)malloc(chunk);
//cout << "empty. malloc: " << chunk << " " << p << endl;
//將分配得來的一大塊當做 linked list 般小塊小塊串接起來
for (int i=0; i < (CHUNK-1); ++i) {
//沒寫很漂亮, 不是重點無所謂.
p->next = (obj*)((char*)p + size);
p = p->next;
}
p->next = nullptr;