前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >拿来即用的脚手架:内存池

拿来即用的脚手架:内存池

作者头像
程序员的园
发布2025-03-10 12:26:46
发布2025-03-10 12:26:46
620
举报

您好,我是昊天,国内某头部音频公司的C++主程,多年的音视频开发经验,熟悉Qt、FFmpeg、OpenGL。如果你对这些方面感兴趣,欢迎关注我的公众号,一起学习,一起进步。

内存池

在C++中,动态分配和释放内存是程序开发的重要组成部分。newdeletemallocfree 这样的操作虽然方便,但频繁使用可能会导致内存碎片化,并且带来额外的性能开销。

内存池(Memory Pool) 是一种优化内存管理的方法,它预先分配一大块连续的内存空间,将其划分成多个较小的内存块,在程序运行时按需分配和回收。这类似于一个“内存仓库”,减少了频繁调用系统级的内存分配操作,提高了性能和内存使用效率。

内存池的原理

内存池的基本工作原理包括以下几个步骤:

  • 预分配内存:程序启动时,向系统申请一大块连续的内存空间。
  • 内存块划分:将这块内存拆分成多个大小相同或不同的小块,形成可供分配的内存单元。
  • 分配内存:当程序需要新对象时,从内存池中取出空闲块,而不是向操作系统请求新的内存。
  • 回收内存:当对象不再使用时,归还到内存池,以备后续使用。

可以将内存池比作一个图书馆:

  • 书架(内存池)上预先摆放了大量空书籍(内存块)。
  • 读者(程序)借书(分配内存),可以立即取走,而不用等待印刷(系统分配新内存)。
  • 归还时(释放内存),书籍回到书架,后续读者可以继续借阅。

内存池的实现

内存池按使用场景可分为固定大小块内存池和动态大小块内存池,如下:

  • 固定大小块的内存池:适用于管理相同大小的对象,如所有对象的大小均为sizeof(float)*1024。
  • 动态大小块的内存池:适用于管理不同大小的对象,如对象的大小为sizeof(float)*1024*ch_num;ch_num为1、2、6、8、12等。

为了方便读者朋友使用,昊天实现了如上两种的内存池:FixedMemoryPoolDynamicMemoryPool。在DynamicMemoryPool中,借助std::unordered_mapFixedMemoryPool实现了动态大小块的内存池。为了保证内存使用效率,动态大小块的内存池中,每个内存块的大小为16的整数倍,如16、32、48、64等。可在交流群内获取源码。

注意事项

书写和使用内存池需要注意如下问题:

  • 缓冲区溢出:分配过小或未正确管理指针,可能导致非法访问。建议进行严格的边界检查,避免越界访问。
  • 释放后访问:对象被释放后仍然被使用,可能导致未定义行为。建议采用 nullptr 标记已释放的指针。
  • 内存泄漏:未正确释放分配的内存,导致系统内存耗尽。推荐使用智能指针(如 std::unique_ptrstd::shared_ptr)管理内存。

结论

内存池是一种优化动态内存管理的有效技术,适用于高性能、低延迟的场景,如游戏、嵌入式系统和服务器应用。固定大小块的内存池简单高效,适合同类型对象,而动态大小块的内存池灵活多变,适用于不同需求。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员的园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 内存池
  • 内存池的原理
  • 内存池的实现
  • 注意事项
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档