有人能指出一个来源或概述低碎片堆的算法是如何工作的吗?
答案 0 :(得分:1)
首先确定要用于分配的内存块的“倍数”。我通常使用8个字节。
在应用程序启动时,创建一个向量,其中向量中的每个元素都指向内存块的“池”。向量中的第一个索引将用于8字节或更少的内存分配。向量中的第二个索引将用于9-16个字节的内存分配,依此类推。
在每个池中,以更大的块分配内存。例如。在池中分配8个字节(或更少),不分配8个字节,但分配N次8个字节。在池中记住哪些部分在应用程序中真正分配,哪些部分只是等待分配。
释放内存时,请不要立即释放内存,而是保留一些块以备下次分配该大小。 只有当您有大量后续空闲块时,才将可用内存返回给操作系统。
这是基本的想法。其余的是实现池(通常是链接的块列表)。
困难的部分是将堆实现集成到应用程序中。
另请查看How to solve Memory Fragmentation以及我在Memory management in memory intensive application
的评论答案 1 :(得分:1)
来自MSDN:
LFH不是一个单独的堆。相反,它是一种应用程序可以为其堆积启用的策略。当启用LFH时,系统以某些预定大小分配存储器。当应用程序从启用了LFH的堆请求内存分配时,系统会分配足够大的最小内存块以包含所请求的大小。
许多内存管理器都使用此策略,但细节可能会有所不同。