防止内存碎片

时间:2010-02-16 21:04:45

标签: c++ windows memory

有人能指出一个来源或概述低碎片堆的算法是如何工作的吗?

2 个答案:

答案 0 :(得分:1)

首先确定要用于分配的内存块的“倍数”。我通常使用8个字节。

在应用程序启动时,创建一个向量,其中向量中的每个元素都指向内存块的“池”。向量中的第一个索引将用于8字节或更少的内存分配。向量中的第二个索引将用于9-16个字节的内存分配,依此类推。

在每个池中,以更大的块分配内存。例如。在池中分配8个字节(或更少),不分配8个字节,但分配N次8个字节。在池中记住哪些部分在应用程序中真正分配,哪些部分只是等待分配。

释放内存时,请不要立即释放内存,而是保留一些块以备下次分配该大小。 只有当您有大量后续空闲块时,才将可用内存返回给操作系统。

这是基本的想法。其余的是实现池(通常是链接的块列表)。

困难的部分是将堆实现集成到应用程序中。

  • 如果您仍在使用malloc / free,请使用#define重新定义malloc和free
  • 如果您使用new / delete,请定义全局新建和删除操作符

另请查看How to solve Memory Fragmentation以及我在Memory management in memory intensive application

的评论

答案 1 :(得分:1)

来自MSDN

  

LFH不是一个单独的堆。相反,它是一种应用程序可以为其堆积启用的策略。当启用LFH时,系统以某些预定大小分配存储器。当应用程序从启用了LFH的堆请求内存分配时,系统会分配足够大的最小内存块以包含所请求的大小。

许多内存管理器都使用此策略,但细节可能会有所不同。