内存池——实现一个简单的固定大小的内存池

最近在STL当中看到了第二级内存分配器,这里有个内存池的内容,在这在知乎上看到了内存池的相关内容,所以萌生了一个想自己写一个简单的内存池的想法。

这种简单的内存池,援引自知乎的:

实现固定内存分配器:
即实现一个 FreeList,每个 FreeList 用于分配固定大小的内存块,比如用于分配 32字节对象的固定内存分配器,之类的。每个固定内存分配器里面有两个链表,OpenList 用于存储未分配的空闲对象,CloseList用于存储已分配的内存对象,那么所谓的分配就是从 OpenList 中取出一个对象放到 CloseList 里并且返回给用户,释放又是从 CloseList 移回到 OpenList。分配时如果不够,那么就需要增长 OpenList:申请一个大一点的内存块,切割成比如 64 个相同大小的对象添加到 OpenList中。这个固定内存分配器回收的时候,统一把先前向系统申请的内存块全部还给系统。

1.探索内存池的使用原因


为什么要使用内存池呢?这个解决方案也算是突出CPP的效率的一个方面了,我们会经常面对类似于高并发的这种情况,即简单理解为经常性的new对象,然后delete对象,经常性的发出分配请求和释放请求给操作系统,势必带来效率的下降,所以考虑到这一点,设计者们设计出了内存池。

内存池简单的理解就是,进行一次性的开出大块空间,当你需要构造对象的时候,拿出来构造,当你需要释放的时候,并不还给操作系统,还给内存池,然后接下来使用直接从内存池当中取出进行操作。

所以,在多次进行分配请求与释放请求的场景下,内存池能够提高效率。

另外,当我们进行释放以后,会产生内碎片的问题,就是对一块整块的内存,会出现中间出现片段,这样,为了提升内存的利用率,我们把这快空间还回内存池,下次可以再使用这块片段,提升了效率,详细看下面的图我相信你能够理解的。

所以,内存池也可以提高内存利用率,解决外碎片的问题。

2.内存池的实现


对下面这种内存池进行实现,下面的内存池进行实现的时候,我们其实就是简单的实现成为一个自由链表的形式,接下来,依靠图示的情况为大家讲解。

其实,与其说我们的内存池是一个内存池,并不如说是一个对象池,因为我们这里的思路的主要核心就是通过对象的构造和析构来维护整个内存池。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值