内存池

今天花了两个小时的时间学习内存池,看了之后才发现这种东西真的很巧妙,很有思想。不知道是谁最先提出的这种想法,但是真的很有趣。http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html中的文章极其详细深刻的讲解了这个技术,非常清晰啊。

池技术的共有特点就是预分配,而内存池也是这样。首先有一个结构体,用来管理这个池,然后分配出一个个的块,每个块中又包含了若干个内存单元。当需要使用内存时将空闲的内存单元分配出去,用完再归还回来。这大概就是内存池的思路。当然内存池也有好坏之分,好的要能够动态增长,要能有自适应行,要有好的回收机制,同时还可以不去固定每一个内存单元的大小,做出动态的,但是我还没有理解那么深刻,也没有实践过,这里先只记录最简单的固定大小的内存池。

 

这就是内存池的结构。其中MemoryBlock 是一个结构体,定义如下:

struct MemoryBlock
{
 USHORT nSize; //
USHORT nFree; //该块中还有多少个内存单元可以使用
USHORT nFirst; //下一个可以使用的内存单元的编号
USHORT nDummyAlign1;
MemoryBlock* pNext; //下一个块
char aData[1]; //第一个可以使用的内存单元的首地址,这里这样定义其实不确切的,因为它并不在内存单元中,而是在该结构体中

}

MemoryPool 可以看成是一个类,这里没有写构造函数

class MemoryPool
{
private:
 MemoryBlock* pBlock;//指向下一个块的指针
 USHORT nUnitSize; //
 USHORT nInitSize; //初始化时分配的块的个数
 USHORT nGrowSize; //动态增长时分配的块的个数
 };

在使用时,首先查找块,然后看块的nFree是否为0,不为零,这将nFirst指向的内存单元分配出去,然后nFree-1,nFirst=Data[k]这就意味着再需要分配,则分配第K个内存单元。

累了,不爱写了,回收部分以后再补上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值