简单内存池的实现
说明
操作系统维护malloc和free的基本原理是通过一个链表来记录的,每次malloc和free都有不小的开销,随着系统内存碎片化的加剧而开销增加,程序中可以通过申请一块大内存并自行分配的方式减少malloc和free操作,提供程序效率。提供一种简单内存池的方案供大家品鉴。
设计思路
1.已知单次需要分配内存size为length,内存池大小为N个length
2. 设计维护内存池的数据结构
3.初始化内存池
4.单次申请内存
5.释放内存
PS:从过程来说,最关键的就是设计数据结构和初始化操作。
实现方案
采用STL的list维护内存池,初始化申请足够大的内存并将可用内存插入list ,单次申请即从list中取出一个内存块,释放内存将可用内存插入list中。实现如下
#include<list>
using namespace std;
struct node{ char* start; char* end; };
list<node> mempool;
bool init(unsigned int length, unsigned int n)
{
node nodeinsert = {};
char* mem = (char*)malloc(length*n);
if (!mem)
return false;
for (int i = 0; i < n; i++)
{
nodeinsert.start = mem + i*length;
nodeinsert.end = mem + (i + 1)*length - 1;
mempool.push_back(nodeinsert);
}
}
char* mempoolalloc()
{
char* ret = NULL;
if (!mempool.empty())
{
ret = mempool.back().start;
mempool.pop_back();
}
return ret;
}
void mempoolfree(char* start, char* end)
{
node nodeinsert;
nodeinsert.start = start;
nodeinsert.end = end;
mempool.push_back(nodeinsert);
}
后记
比较遗憾的是电脑没有装VISO,没有能够做一张简明点的图,须知文字总是难以完全表达意思。