2013-10-23 93 views
3

如果我有很多函數調用malloc()小尺寸(通常最多500字節),然後完成釋放。將malloc()重新相鄰的塊或將繼續分裂更大的塊並導致碎片?malloc和內存碎片

對於這種情況,使用足夠大小的緩衝區還是每次調用malloc()更好?

我對GNU C庫感興趣,但關於其他實現的答案也很有用。

+0

由於碎片,你有問題嗎?你期望在未來有它嗎?如果這些問題的答案是「否」,那麼不要擔心。另一方面,如果你製作的程序應該運行很長一段時間(並且很長時間我的意思是幾周甚至幾個月或幾年)而不重啓,那麼你可能想要實現你自己的堆分配系統(它可以基於'malloc',分配一個巨大的「堆」並使用它)。如果你搜索一下,有很多免費的分配算法。 –

+0

@JoachimPileborg我沒有碎片問題,也沒有期待我現在正在做的事情。我只是有興趣知道。 – 2013Asker

+0

@JoachimPileborg它可能會找到比GCC更好的實現,它可以減少碎片嗎?這會暗示海灣合作委員會的執行情況不妙。 – Lundin

回答

4

malloc()完全依賴於實現。你真的不能說'正式'的任何事情。

如果你真的關心它,你總是可以編寫一個數據結構來維護一個巨大的500字節項目池,從中獲取和回報。所以基本上是一個特定的malloc,併爲該特定的數據類型免費。對於具有固定大小對象的系統,這些事情確實有點幫助,並且它們的最大數量不會變化太大。例如在具有固定大小節點的樹操作上。

與不需要考慮malloc()的系統相比,malloc()是通用的並且必須考慮不同塊大小的事實總是會給它帶來不利影響。