C++ 防止内存碎片

C++ 防止内存碎片,c++,windows,memory,C++,Windows,Memory,有人能给我指出一个来源或概述一下低碎片堆的算法是如何工作的吗?首先决定要将哪些“倍数”用于分配的内存块。我通常使用8个字节 在应用程序启动时,创建一个向量,其中向量中的每个元素都指向内存块的“池”。向量中的第一个索引将用于8字节或更少的内存分配。向量中的第二个索引将用于9-16字节的内存分配,依此类推 在每个池中,以更大的块分配内存。例如,在分配8字节(或更少)的池中,不要分配8字节,而是分配N乘以8字节。在池中,记住应用程序中真正分配了哪些部分,哪些部分正在等待分配 释放内存时,不要立即释放内

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

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

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

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

释放内存时,不要立即释放内存,但要为下一次分配该大小的内存块做好准备。 只有在后续有大量空闲内存块时,才将空闲内存返回到操作系统

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

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

  • 如果仍在使用malloc/free,请使用#define重新定义malloc和free
  • 如果使用“新建/删除”,请定义全局新建和删除运算符
另请看一看,以及我在

上的评论:

LFH不是一个单独的堆。相反,它是应用程序可以为其堆启用的策略。当LFH被启用时,系统以特定的预定大小分配内存。当应用程序从启用LFH的堆请求内存分配时,系统将分配足够大的最小内存块,以容纳请求的大小


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

听上去,大多数人的问题是,“如何创建碎片最少的内存分配程序?”。但我认为作者的意思是,“Windows的低碎片堆使用哪种算法?”这个问题的答案并不是简单的搜索。