这是一个简单的例子来解释这个问题(使用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()
可能会执行此操作,我该怎么办呢?
这只是一个非常简单的例子来展示我正在处理的问题
答案 0 :(得分:1)
内存分配确实经常成为瓶颈。但编写自己的分配器并不容易。有多种方法可以做错。
在您的情况下,某种slab allocator似乎符合您的需要。
但是,您可以选择依靠像[{3}}这样的经过强化实施的实施,而不是自己编写。 Facebook使用它与C和C ++,甚至贡献补丁。见jemalloc。
如何将jemalloc与c ++ 集成的问题得到处理facebook engineering blog post
PS:我不引用facebook,因为它是炒作,但因为它是一个有着真正性能问题的知名公司。 Google还使用自定义分配器:here