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



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

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

假设CCD_ 1对象的大小为3,并且CCD_ 2对象的大小是4,我的堆的大小是12,删除a2后,内存将如下所示:

XXX---XXX---

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

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

我可以通过创建某种CCD_ 4函数来动态地避免这种情况吗,一个将"移动"对象a3的内存并将其放在:之后的函数

XXXXXX-------

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

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

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

在您的情况下,看起来某种slab分配器可以满足您的需要。

但是,您可以选择依赖像jemalloc这样久经沙场的实现,而不是自己编写。Facebook将其与C和C++结合使用,甚至提供了补丁。请参阅这篇facebook工程博客文章。

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

附言:我引用脸书并不是因为它是炒作,而是因为它是一家知名的公司,有真正的业绩问题。谷歌还使用了一个自定义分配器:tcmalloc

最新更新