-1

这是一个解释问题的简单示例(使用 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并将其放在 a 之后:

XXXXXX-----

该函数显然应该在删除后调用a2,所以也许重新实现deallocate()或者delete()可以做到这一点,请问我该怎么做?

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

4

1 回答 1

1

内存分配确实经常是一个瓶颈。但是编写自己的分配器并不容易。有多种方法做错了。

在您的情况下,看起来某种平板分配器会满足您的需要。

但是,您可以选择依赖像jemalloc这样久经考验的实现,而不是自己编写。Facebook 将它与 C 和 C++ 一起使用,甚至提供补丁。请参阅此facebook 工程博客文章

这里处理了如何将jemalloc与c++集成的问题

PS:我不是因为它是炒作而引用facebook,而是因为它是一家有实际业绩问题的知名公司。Google 还使用自定义分配器:tcmalloc

于 2015-03-23T10:46:57.340 回答