c++ 内存管理(3)allocator的设计与应用

本文根据《侯捷–c++内存管理》一课进行学习总结:

allocator的演变

  1. 第一个版本是我们自己在类里面进行内存申请,先申请一大块chunk大小的内存空间,再用链表将chunk中切成块,每一块是一个screenChunk=24的大小,用linked list的方式进行连接。
    在这里插入图片描述
    在这里插入图片描述
  2. 第二个版本和第一个版本类似,区别就是使用了union,并用一个*next作为头指针(指向第二块作为开始)。
    在这里插入图片描述
    在这里插入图片描述
  3. 第三个版本,将内存分配封装起来,由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;  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值