内存池应用

10 篇文章 0 订阅

内存池技术详解里面已经很清楚地讲解了写一个内存池的方法了。而这里我结合游戏开发中的使用,说说内存池的应用。

首先不管怎么去应用,如果我们不去手动释放占有的资源,那么我们的内存总有用完的那么一天。

我们的内存池

class MemoryPool
{
	struct Node
	{
		Node():next(NULL){}
		~Node():next(NULL){}
		Node* next;
		unsigned char data[0];
	};
	Node* free_lsit;
	Node* alloc_list

	public:
		构造函数
		析构函数

		void alloc(int dataSize);        //分配内存,按内存池技术详解的做法,大同小异
		void free(unsigned char* p);     //回收,按内存池技术详解做法
	private:
		allSize;                         //分配大小
		allNum;                          //分配块数
		useNum;                          //使用数
		freeNum;                         //空闲数
};

而现在我需要做的就是设计一个内存管理的类,来使用它,

        再设计一个类MemoryAllocator中,声明一个static MemoryPool pool[1024]; 接口为void allocator(size); 

        当需要分配size个内存时,size除2^4 = 16,向上取一个整数result,那么这个size的内存就由pool[result]来管理了,16的片太小了,当size太大时,这个pool就不够用了,我们完全可以让这个pool去管理16字节的内存, 32自己的内存,2^n次房的内存,可以根据size大小来确定应该让哪个2^4n大小的pool管理。

这样在我们频繁申请释放内存的消耗变小,效率增加,除了当free_list为NULL时,才会向系统申请一块内存,其他条件则是O(1)的消耗。当然也可以设计成,预分配size的内存,每次需要再分配内存时,像系统申请size*2^n的空间,这样申请内存的操作就更少,std::vector也是这个样子的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值