在C ++中动态分配内存的碎片整理

动态分配内存的碎片整理(使用new和malloc操作符分配)如何在C ++中工作?


在C ++堆中没有碎片整理,因为应用程序可以自由地保留指向已分配内存的指针。 因此,堆管理器无法移动已经分配的内存。 唯一的“碎片整理”可能是如果你释放两个相邻的块。 然后堆管理器将把这两个块合并成一个可以再次用于分配的更大的空闲块。


你可能想看看slab分配器。 这不会是你的银弹,但对于具体问题你可能能够缓解压力。 在我过去的一个项目中,我们已经编写了自己的分配器,这是一件相当复杂的事情,但它确实设法解决了这个问题。

虽然我一般同意其他答案,但有时在特定用例中有希望。 例如可能使用池分配器处理的类似对象:http://www.boost.org/doc/libs/1_53_0/libs/pool/doc/index.html

另外一个有趣的读法是带有boost进程的分配器:http://www.boost.org/doc/libs/1_53_0/doc/html/interprocess/allocators_containers.html#interprocess.allocators_containers.stl_allocators_adaptive

链接地址: http://www.djcxy.com/p/78719.html

上一篇: Defragmentation of dynamically allocated memory in C++

下一篇: Does dynamic memory allocation differ in C and C++ in popular implementations?