【问题标题】:Reallocate memory to avoid memory fragmentation重新分配内存以避免内存碎片
【发布时间】:2015-03-23 10:29:08
【问题描述】:

这是一个解释问题的简单示例(使用 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()可以做到这一点,请问我该怎么做?

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

【问题讨论】:

  • 让您的操作系统处理内存碎片。不要尝试和第二次猜测。如果您真的想做某事,请创建一个 std::vector 并使用它。您可以使用另一个 int 向量来存储“已删除”对象的索引。
  • 这只是一个简单的例子,我实际上在做一个非常大的项目
  • 首先,您需要证明碎片对您的软件来说是个问题。完成后,如果您不喜欢操作系统的分配/重新分配策略,您可以自己制作。我不会尝试为您的项目破解操作系统内存管理器。
  • 你能给我一个简单的例子来说明如何改变分配/重新分配策略吗?以及如何破解操作系统内存管理器? (我可能不得不这样做,我只是这个项目的实习生,有很多专家会帮助我)
  • 在这种情况下,在数组或向量中创建对象,以便将它们放置在一个内存块中。

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


【解决方案1】:

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

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

但是,您可以选择依赖像jemalloc 这样久经考验的实现,而不是自己编写。 Facebook 将它与 C 和 C++ 一起使用,甚至提供补丁。看到这个facebook engineering blog post

问题如何将jemalloc与c++集成处理here

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

【讨论】:

  • 感谢您的回答,您知道编写我自己的分配器的任何教程吗?这是一个研究项目,所以我可能需要编写自己的分配器
猜你喜欢
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 2013-08-14
  • 2010-11-26
相关资源
最近更新 更多