重新分配内存以避免内存碎片

时间:2015-03-23 10:29:08

标签: c++ memory dynamic-memory-allocation realloc heap-fragmentation

这是一个简单的例子来解释这个问题(使用c ++):

A* a1 = new A;
A* a2 = new A;
A* a3 = new A;
delete(a2);
B* b = new B;
.
.
.

让我们说A对象的大小为3, 并且B对象的大小为4, 我的堆的大小是12, 删除a2后,内存将如下:

XXX XXX --- ---

即使有足够的内存,我也无法创建对象B* b,因为它不是连续的。

只是内存碎片的一个简单示例。

我可以通过创建某种reallocate()函数来动态地避免这种情况, 一个能够“移动”的功能。对象a3的记忆并将其放在:

之后

XXXXXX ------

删除a2后,显然应该调用该函数,因此重新执行deallocate()delete()可能会执行此操作,我该怎么办呢?

这只是一个非常简单的例子来展示我正在处理的问题

1 个答案:

答案 0 :(得分:1)

内存分配确实经常成为瓶颈。但编写自己的分配器并不容易。有多种方法可以做错。

在您的情况下,某种slab allocator似乎符合您的需要。

但是,您可以选择依靠像[{3}}这样的经过强化实施的实施,而不是自己编写。 Facebook使用它与C和C ++,甚至贡献补丁。见jemalloc

如何将jemalloc与c ++ 集成的问题得到处理facebook engineering blog post

PS:我不引用facebook,因为它是炒作,但因为它是一个有着真正性能问题的知名公司。 Google还使用自定义分配器:here