【问题标题】:Malloc and memory fragmentationMalloc和内存碎片
【发布时间】:2013-10-23 06:05:55
【问题描述】:

如果我有很多函数调用 malloc() 来处理小尺寸(通常最多 500 字节),然后在完成后释放。 malloc() 会重新组合相邻的块还是会继续分裂更大的块并导致碎片?

对于这种情况,是使用足够大的缓冲区还是每次都调用malloc()更好?

我对 GNU C 库感兴趣,但有关其他实现的答案也很有用。

【问题讨论】:

  • 你有没有因为碎片化的问题?你希望在未来拥有它吗?如果这些问题的答案是“否”,那就不要担心。另一方面,如果您编写的程序应该运行很长时间(我的意思是数周甚至数月或数年)而无需重新启动,那么您可能想要实现自己的堆分配系统(可以基于malloc,分配一个巨大的“堆”并使用它)。如果你稍微搜索一下,有很多免费的分配算法。
  • @JoachimPileborg 我没有碎片问题,也不希望我现在正在做的事情。我只是想知道。
  • @JoachimPileborg 是否有可能找到比 GCC 中更好的实现,从而减少碎片?这会暗示 GCC 的实现在某种程度上很差。
  • GCC 提供的malloc 算法确实不错,但确实会碎片化。我的意思是,如果碎片可能是一个问题,那么找到一种可以“碎片整理”堆以完全避免它的算法。但是在日常的日常使用中,即使对于很多服务器类型的程序,标准的malloc 也可以。
  • 我相信 GNU 实现会合并空闲块,以后可以使用合并的块来分配更大的内存。但是,我不确定它是否是最有效和最好的实现

标签: c malloc gnu


【解决方案1】:

malloc() 完全依赖于实现。你真的不能“正式”说什么。

如果您真的关心它,您可以随时编写一个数据结构来维护一个包含 500 字节项目的巨大池,您可以从中获取和回馈。所以基本上是一个特定的 malloc 并且对于该特定数据类型是免费的。这些东西对于具有固定大小对象的系统确实有点帮助,并且它们的最大数量不会改变太多。例如在具有固定大小节点的树操作上。

与不必考虑这一点的系统相比,malloc() 是通用的并且必须考虑不同的块大小这一事实总是会给它带来不利影响。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2013-08-14
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2013-09-26
    • 2018-09-25
    • 2012-12-11
    相关资源
    最近更新 更多