c++ - 避免内存碎片的方法

标签 c++ memory-management rtos memory-fragmentation

我从 RTOS 分配了一个大内存池(我已经知道我的应用程序内存需求,它不会增长超过一定大小)。然后我的应用程序分配请求从该池中得到满足。

最近我开始遇到一个问题;即使内存存在,分配请求也没有得到满足(集成内存基准标记框架,这表明了这一点),调查显示我们正在遭受内存碎片的困扰。

我的应用程序严重依赖STL(还从网络接收数据,XML解析,图像处理,将其保存为PNG等),以及内存碎片背后的堆内存分配(还有其他原因吗?),什么是最好的避免的方法?

最佳答案

内存碎片的典型原因是随着池的老化,大内存块被分成越来越小的 block 。避免这种情况的简单方法是使用固定尺寸。

这显然不能解决 XML 使用 18MB 存储的问题,其中每个 XML 节点都存储为一个小字符串,然后尝试加载 4096 x 4096 x 8 位 PNG(16MB),如果你的池是 24MB ,因为 XML 会将您的内存分成小块,然后您需要 16MB 的连续内存。但是“固定大小”将避免 <aaa>b</aaa> 的 XML 字符串占用 4 字节和 2 字节的内存,从而使内存对于存储在那里的任何其他内容完全无用,因为没有其他对象是 4 或 2 字节长的。

此方法将要求您的内存分配器本身被写入以考虑“固定大小”。

关于c++ - 避免内存碎片的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15848552/

相关文章:

c++ - 内存堆问题C++,动态分配多维数组

c - Valgrind:大小为 8 的无效读/写

c++ - 将 DKM 项目链接到内核镜像 (VIP) 项目作为 VxWorks Workbench4 中的子项目/额外模块

c++ - 从不同线程创建 QMainWindow

c++ - 什么时候不调用重写的虚函数

c++ - WinApi LineTo 不刷新行

iphone - UICollectionView 在 iPhone 3GS 上的 iOS 6.0 上崩溃

c - Linux内核中的udp_deliver api在哪里?

c - 当前在任何任务或另一个 ISR 中的 RTOS 中发生中断时会发生什么情况?

c++ - 使用指针到指针时出错