2010-03-10 27 views
0

對於Visual C++運行時堆,我可以獲得與HeapCompact()相同的效果嗎?我怎樣才能做到這一點?是否可以壓縮VC++運行時堆?

+0

「run-time heap」是什麼意思?還有什麼其他的? – 2010-03-10 10:14:44

+0

@Neil Butterworth:我的意思是malloc()使用的那個。在Win32中,程序可以使用HeapCreate()創建更多的堆。 – sharptooth 2010-03-10 10:23:18

+0

出於興趣,是否有一個令人驚訝的好理由,即自由塊合併不會自動發生? http://msdn.microsoft.com/en-us/library/cc265897.aspx – 2010-03-10 11:27:57

回答

2

您可以使用_get_heap_handle獲取CRT堆的HANDLE,然後調用HeapCompact。不確定這是否支持/穩定,因爲我自己沒有嘗試過。我想你會想在序列化模式下調用HeapCompact來讓這個工作有任何機會。

如果您打算遇到這個問題,只需調用句柄上的HeapSetInformation(_get_heap_handle上的每個MDSN文檔),並讓內置的LFH爲您處理壓縮。

2

IIRC不是沒有編寫自己的內存管理器。這也是一件不平凡的工作,尤其是如果您希望不僅僅將相鄰較小的空白內存塊組合成較大的內存塊,而且還要做更多的工作。

+0

實際上,組合相鄰的塊是HeapCompact()唯一的功能。 – sharptooth 2010-03-10 13:37:32

+1

你必須*真的*需要這樣做,因爲沒有更好的主意。 – Spike 2010-03-10 14:24:35

+0

是的,內存分配失敗的一個原因是堆碎片。在'malloc()'返回'NULL'的情況下,你可以嘗試'HeapCompact(GetProcessHeap(),0)',再次交叉你的手指,然後再'malloc()'。其實這是一個糟糕的解決方案,但當時間緊迫時它可能會有所幫助。您應該真正優化/改變程序的內存分配策略,例如使用內存映射文件([link1](http://msdn.microsoft.com/en-en/library/dd997372.aspx)和[link2](http://en.wikibooks.org/wiki/Optimizing_C%2B %2B/General_optimization_techniques /輸入/輸出#內存mapped_file所))。 – 2012-09-05 12:36:24

相關問題