编写内存管理器并对内存进行碎片整理

时间:2017-05-02 17:04:05

标签: c++ memory-management

我的想法是写一个内存管理器,一次分配一堆内存,以最大限度地减少malloc和免费通话,我已经尝试过两次写这个,但两次都遇到了对内存进行碎片整理的问题

你可以经常检查一个块是否为空,如果它是空的,则删除它。但是,让我们说你的块每个100字节,首先你分配20个字节的内存,这将创建一个新的100字节块,因为还没有块,然后你分配80个字节,这填充第一个块,然后你分配另外20个字节,这将创建另一个新块,因为第一个块已满,然后你释放第二个分配(80个字节),并留下两个块,其中只使用前20个字节,这意味着你有100个分配的字节可以通过将20个字节从第二个块移动到第一个块并删除第二个块来释放。

这些是我遇到的问题:

  1. 你不能移动内存,因为这意味着所有指向该内存的指针都必须更新,为此你需要知道他们的地址,你不会这样做;
  2. 100字节是一个非常小的块大小,如果我想在内存中存储一​​个非常低分辨率(64,64)的ARGB图像怎么办?这将使用16KB的内存并且移动所有这些内容可能甚至比根本不写内存管理器更慢。
  3. 在这之后编写自定义内存管理器是否值得?

1 个答案:

答案 0 :(得分:1)

  

在这之后编写自定义内存管理器是否值得?

这是在征求意见,但我会尝试给出一个事实答案。

大多数操作系统和语言支持库附带的内存分配器通常质量非常高,旨在解决您遇到的问题类型(碎片和性能)以及其他问题。它们与通用内存分配器一样好。

如果您的应用程序具有可被利用的特定分配模式,您可以(稍微)做一些比提供的内存分配器更好的操作。这种情况很少见,但通常可以通过制作比通用内存管理器简单得多的东西来利用它。

  

你无法移动内存

真。大多数现代系统甚至都没有尝试移动内存 - 他们试图避免碎片开始(通常通过聚类类似大小的分配)。

旧系统(没有虚拟内存管理器的系统)有时会使用具有额外间接层的内存管理器。分配器不会返回指向已分配内存的指针,而是返回一个“句柄”,它可以像内存管理器维护的表中的索引一样简单。当用户想要实际访问内存时,他们会“锁定”它。内存管理器可以自由移动未锁定的内存(例如,消除碎片),因为句柄提供了额外的间接级别。

  

如果我想存储非常低分辨率(64,64)的ARGB图像

,该怎么办?

大多数内存管理器提供一系列大小,因此不会在 n 较小的块之间拆分大量分配。大多数人会对系统分配器进行非常大的分配,在虚拟内存操作系统上,除非进程地址空间过于分散,否则通常可以解决问题。