青山相待

            白云相爱

            梦不到紫罗袍共黄金带

            一茅斋

            野花开

            管甚谁家兴废谁成败

            陋巷单瓢亦乐哉

            贫,气不改!

            达,志不改!

简单内存池的实现

说明

操作系统维护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,没有能够做一张简明点的图,须知文字总是难以完全表达意思。 

posted @ 2014-07-04 12:39  Leo.Z  阅读(314)  评论(0编辑  收藏  举报