【发布时间】:2013-10-23 06:05:55
【问题描述】:
如果我有很多函数调用 malloc() 来处理小尺寸(通常最多 500 字节),然后在完成后释放。 malloc() 会重新组合相邻的块还是会继续分裂更大的块并导致碎片?
对于这种情况,是使用足够大的缓冲区还是每次都调用malloc()更好?
我对 GNU C 库感兴趣,但有关其他实现的答案也很有用。
【问题讨论】:
-
你有没有因为碎片化的问题?你希望在未来拥有它吗?如果这些问题的答案是“否”,那就不要担心。另一方面,如果您编写的程序应该运行很长时间(我的意思是数周甚至数月或数年)而无需重新启动,那么您可能想要实现自己的堆分配系统(可以基于
malloc,分配一个巨大的“堆”并使用它)。如果你稍微搜索一下,有很多免费的分配算法。 -
@JoachimPileborg 我没有碎片问题,也不希望我现在正在做的事情。我只是想知道。
-
@JoachimPileborg 是否有可能找到比 GCC 中更好的实现,从而减少碎片?这会暗示 GCC 的实现在某种程度上很差。
-
GCC 提供的
malloc算法确实不错,但确实会碎片化。我的意思是,如果碎片可能是一个问题,那么找到一种可以“碎片整理”堆以完全避免它的算法。但是在日常的日常使用中,即使对于很多服务器类型的程序,标准的malloc也可以。 -
我相信 GNU 实现会合并空闲块,以后可以使用合并的块来分配更大的内存。但是,我不确定它是否是最有效和最好的实现