是否有可能完全避免堆碎片?

use*_*061 14 c++ memory-management

例如,如果动态存储器的解除分配总是在与分配相反的方向上完成.在这种情况下,是否可以保证堆不会碎片化?

从理论的角度来看:对于一个非常重要的应用程序来说,是否存在一些管理内存以完全避免堆碎片的现实方法?(在堆中的每次原子更改之后,堆仍然是未分段的吗?)

use*_*421 19

对于非常重要的应用程序存在一些现实的方法如何管理内存以完全避免堆碎片

是.分配堆栈中的所有内容.这似乎是一种完美的建议,但我已经在非平凡的计划中做到了.

编辑对于绝对清晰和避免疑问,我说:" 栈".我明确指的是自动存储,即局部变量堆栈,而不是任何堆栈类.关于此的一些评论基本上是钝的.

  • @MartinJames:我认为没有人怀疑他在谈论使用具有自动生命周期的变量。大多数实现将它们放在调用堆栈上,由一个专门指定为堆栈边缘指针的 CPU 寄存器管理。 (5认同)
  • 仅为huevos提出建议以表明这种方法.虽然我认为全局对象/数组也可以在这里提供帮助.许多老派游戏处理大型全球阵列中的所有内容.这很麻烦,但它工作和零内存分配器开销. (2认同)

cma*_*ter 5

真正避免堆碎片的唯一方法是自己进行内存管理,跟踪所使用的所有指针,并不时对堆进行碎片整理.但请注意,有一个原因可以解决这个问题:它没有得到回报.您需要花费在对堆进行碎片整理的代码和性能上的努力太大了.

只是一个历史信息的传闻:
旧的MacOS(MacOS-X时代之前!)使用所谓的内存对象句柄:指向实际内存区域的指针列表.这样做的好处是操作系统可以通过修改表中的指针来移动内存对象; 句柄的任何引用都将保持不变.但是,每次要在系统调用中访问其数据时,都必须锁定句柄.应该提到的是,这是在多核成为主流之前,因此没有真正的并发性发生.使用多线程应用程序时,每次都必须锁定句柄,至少如果允许其他线程调用系统.我再说一遍,有一个原因是句柄在MacOS-X中无法存活...