一个C++的内存池和内存管理的实现(一)

用C++编写高效稳定的软件,有效的内存管理通常是绕不开的一个题目,尤其是对于复杂庞大的商业软件。一方面,内存泄露、指针越界的bug查找即使是C++老鸟都会头大。另一方面,内存碎片的积累会造成系统性能下降甚至崩溃。我本人是做视频分析算法的,算法运行中每帧都会有大量的申请释放内存操作,并且顺序和跨度不一,由此造成的内存碎片问题不容忽视。一个可行的解决方案是自己overload operator new和delete函数,在其中对内存进行分配、释放、重用、和其他管理。某牛曾经说过,“我工作过的公司里,就没有不自己overload new和delete的”。好吧,我们现在也这么干一回。

首先,我们先实现一个内存池。泄露和越界的自动查找功能我们先放一边,当然代码里也会先保留一些结构或字段给它们用。内存池的思想很简单,一个内存块不用了,不要把它释放给系统,我们自己留下,通常是放在一个link list中,即构成了所谓的池。当程序有新的内存申请时,我们从池里拿一个符合尺寸要求的内存块给它。当然,如果池是空的,或者里面的内存块都太小不符合申请要求,就从系统里申请。这么做的好处是什么?首先,从系统里分配会有不小的时间开销,从池里取会节省不少的时间;其次,避免了内存碎片;最后,在某些应用情况下(比如web服务器连接),可以采用内存池集中释放的机制,可能的内存泄露消饵于无形。

那么问题来了,我如果申请一个4字节的char数组,池中只有1个4K的内存块,难道把这个4K的内存给这个数组用,岂不是有99.9%的是浪费了?A同学说这简单,把4K内存块的头上4个返回给申请的程序,

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值