这里有一个简单的例子来解释这个问题(使用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