动态分配内存(使用 new 和 malloc 运算符分配)的碎片整理如何在 C++ 中工作?
问问题
8713 次
2 回答
9
C++ 堆中没有碎片整理,因为应用程序可以自由地保留指向已分配内存的指针。因此堆管理器不能移动已经分配的内存。唯一可能的“碎片整理”是释放两个相邻的块。然后堆管理器将这两个块组合成一个更大的空闲块,可以再次用于分配。
于 2013-06-09T11:15:59.100 回答
3
你可能想研究一下slab分配器。这不是您的灵丹妙药,但对于特定问题,您可能能够缓解压力。在我过去的一个项目中,我们编写了自己的分配器,这是一件相当复杂的事情,但它确实设法解决了这个问题。
虽然我一般同意其他答案,但有时在特定用例中仍有希望。例如可以使用池分配器处理的类似对象:http: //www.boost.org/doc/libs/1_53_0/libs/pool/doc/index.html
还有一个有趣的读物是 boost interprocess 附带的分配器:http: //www.boost.org/doc/libs/1_53_0/doc/html/interprocess/allocators_containers.html#interprocess.allocators_containers.stl_allocators_adaptive
于 2013-06-11T19:08:44.880 回答