C/C++内存池

C/C++自定义内存池

  • 什么是内存池?为什么要使用内存池?内存池的原理?C语言内存池的实现
  • 仅为学习总结内容

以下内容引用自:
[C++ 应用程序性能优化,第 6 章:内存池] https://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html
[内存池技术的原理与实现] https://www.cnblogs.com/dylantsou/archive/2012/05/13/2498491.html

(一)什么是(自定义)内存池?
  • 内存池(memory pool)是一种内存分配方式,应用程序可以通过系统的内存分配调用预先一次性申请适当大小的内存作为一个内存池,之后应用程序自己对内存的分配和释放则可以通过这个内存池来完成。当需要动态扩展时,才需要再调用系统的内存分配函数,其他时间对内存的一切操作都在应用程序的掌控之中。
(二)为什么要使用内存池?
  • C/C++默认的内存管理方式使用 malloc/free、new/delete 分配与释放内存,这些方法具体是与系统交互实现的,会有额外的开销(系统调用,用户态->内核态等原因?)。同时当系统接到分配内存请求时,首先会在内部维护的内存空闲块表查找,根据一定的算法(有多种)找到合适大小的空闲内存块。如果该空闲内存块过大,还需要切割成需要分配的部分和较小的空闲块,然后系统更细内存空闲块表,完成一次内存分配。当释放内存时,系统把释放的内存块重新加入到空闲内存块表中,(可能)把相邻的空闲块合并成较大的空闲块(当连续内存操作执行后可能会出现,一大块内存被分割成小的内存分配出去了,这些小的内存都是不连续的。当再去分配大的连续内存的时候,尽管剩余内存的总和可能大于所要分配的内存大小,但系统就找不到连续的内存了,所以导致分配错)。

  • 总结下来就是,使用malloc/free 、new/delete可能会存在以下问题
    1、影响程序的执行效率。
    2、内存碎片化。

  • 使用内存池可以有效的避免或降低上述问题:
    1、减少内存的分配和释放次数(内存管理函数的使用),提高应用程序的执行效率(运行时间)。
    2、有效的避免内存碎片化,提高了内存的利用率。

  • 默认的分配和释放算法虽然同样考虑了性能,但是这些内存算法通常是为了应付更复杂、更广泛的情况。

(三)内存池的分类
  • 应用程序自定义的内存池可以根据不同状况分为以下几种类型:

  • 从线程安全角度:
    1、单线程内存池 :整个内存池的生命周期只被一个线程使用。
    2、多线程内存池 :内存池被多个线程共享,在每次分配和释放内存时需要加锁。

    单线程内存池的性能更好,多线程内存池的使用范围更广。

  • 从内存池中可分配内存单元大小:
    1、固定内存池 :从内存池中分配出来的内存单元大小是固定不变的。
    2、可变内存池 :从内存池中分配出来的内存单元大小可以按需求变化。

    固定内存池性能更好,可变内存池的使用范围更广。

(四)内存池的实现原理
  • 固定内存池
    固定内存池是由一系列固定大小的内存池块组成,每一个内存池块又包含了固定数量与大小的内存单元。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值