内存池技术详解里面已经很清楚地讲解了写一个内存池的方法了。而这里我结合游戏开发中的使用,说说内存池的应用。
首先不管怎么去应用,如果我们不去手动释放占有的资源,那么我们的内存总有用完的那么一天。
我们的内存池
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也是这个样子的