欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

C++内存管理之简易内存池的实现

时间:2022-03-02 09:06:21|栏目:C代码|点击:

什么是内存池?

频繁的调用 malloc 会影响运行效率以及产生额外的 cookie, 而内存池的思想是预先申请一大块内存,当有内存申请需求时,从内存池中取出一块内存分配给目标对象。

它的实现过程为:

预先申请 chunk 大小的内存池, 将内存池划按照对象大小划分成多个内存块。以链表的形式,即通过指针将内存块相连,头指针指向第一个空闲块。当有内存申请需求时,首先检查头指针是否指向空闲块,如果是则将头指针指向的第一个空闲块分配出去(从链表移除),同时头指针指向下一个空闲块;若头指针为空,说明当前内存池已分配完,需要重新申请新的内存池。当有内存释放需求时,将释放的内存块重新加入链表的表头,调整头指针指向新加入的空闲块。这也意味着,如果申请了多个内存池,在内存释放的过程中会慢慢的合并到一起。

初步实现

在上面的代码中设置一个内存池为5个内存块,当我们进行100次内存申请后,打印出前10个地址查看,可以看到前5个地址是连续的,后5个也是连续的,但中间由于重新申请了内存池,所以不是连续的。

但是这样的方法还存在着问题,那就是引入了额外的指针内存消耗,接下来将使用embedded pointer进行改进。

使用嵌入指针改进

上面就使用到了嵌入指针,一个 AirplaneRep 对象的大小为 8 字节,而一个 Airplane 的指针大小为 4 字节或 8 字节。在 32 位机器下, 指针可以借用 AirplaneRep 对象所占的 8 字节内存空间中的前 4 个字节,用来连接空闲的内存块。而当内存块需要被分配给对象时,此时它已从链表中移除,也就不需要指针来连接了。此时的 8 字节内存空间由 AirplaneRep 占据。当内存释放时也是同理,由于 Rep 和 next 不会同时用到,所以 embedded pointer 的做法可以减少内存消耗。

更简化:static allocator

前面的实现需要为每个类都重写 operator new 和 operator delete,由于内容是一样的,使用另一个类来完成这些重复的操作。

如此一来,我们的 class 只需要去调用 allocator 即可完成内存的申请和释放工作。

macor for static allocator

在上面的 Foo 和 Goo 中,每次还要写一大堆重复的内容,于是可以使用宏进一步简化:

上一篇:C++ 自由存储区是否等价于堆你知道吗

栏    目:C代码

下一篇:带你粗略了解c++的最大乘积

本文标题:C++内存管理之简易内存池的实现

本文地址:http://www.codeinn.net/misctech/194973.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有