动态内存分配和内存碎片问题

6
如果我有许多函数调用 malloc() 来分配小尺寸的空间(通常最高 500 字节),并在完成后释放。那么,malloc() 是否会重新组合相邻块,还是会继续分割较大的块导致碎片化?
对于这种情况,使用足够大小的缓冲区好还是每次调用 malloc() 较好?
我对 GNU C 库很感兴趣,但回答其他实现也很有用。

你因为内存碎片化而遇到问题了吗?你预计将来会有这种情况吗?如果这些问题的答案都是否定的,那就不用担心了。但是,如果你正在编写一个需要长时间运行(我指的是数周、数月甚至数年)而不需要重启的程序,那么你可能需要实现自己的堆分配系统(可以基于malloc,分配一个巨大的“堆”并使用它)。如果你搜索一下,就会发现有很多免费的分配算法。 - Some programmer dude
@JoachimPileborg,我现在没有分段问题,也不指望会有。我只是对了解这个感兴趣。 - 2013Asker
@JoachimPileborg 有没有可能找到比GCC更好的实现,从而减少碎片化?这意味着GCC的实现在某种程度上很差。 - Lundin
GCC提供的malloc算法确实很好,但它会出现碎片。我的意思是,如果碎片可能成为一个问题,那么就要找到一种可以“整理”堆以完全避免碎片的算法。但在日常使用中,即使对于许多服务器类型的程序,标准的malloc也是可以的。 - Some programmer dude
我相信GNU实现将合并空闲块,并可以随后使用合并的块来分配更大的内存。但是,我不确定这是否是最有效和最佳的实现。 - Poojan
1个回答

5

malloc()是完全依赖于实现的。关于它,您真的不能'正式地'说什么。

如果您确实关心它,您可以编写一个数据结构,维护一个巨大的500字节项目池,从中取出和归还。因此,针对特定数据类型的具体malloc和free。这些东西确实有助于具有固定大小对象和不太经常更改的最大数量的系统,例如使用固定大小节点的树操作。

事实上,malloc()是一般性的,并且必须考虑不同的块大小,这将始终使它处于劣势,与不必考虑这一点的系统相比。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接