2009-06-22 54 views
0

Windows API有一堆用於堆創建和處理的函數:HeapCreate,HeapAlloc,HeapDestroy等。 我想知道程序中另一堆的用途是什麼? 從碎片的角度來看,你會得到外部碎片,其中內存不會在堆中重複使用。所以,即使使用低碎片堆,stil也存在碎片。 額外堆的內存管理似乎是低級別的。所以他們不容易使用。 另外,可能會使用堆中的分配和管理分配的內存來模擬額外的堆。使用HeapCreate函數時,或者在什麼情況下需要多個堆?

那麼用法是什麼?你使用它了嗎?

回答

4

一個用例可能是一個長時間運行的複雜進程,它會執行大量的內存分配和重新分配。如果用戶想要中斷進程,那麼清理當前分配的內存的簡單方法可能是將所有內容都放在私有堆上,然後簡單地銷燬堆。

我已經看到這種技術在嵌入式系統中使用(不使用Windows,因此它沒有使用這些確切的API函數)。自定義內存分配器具有「標記」堆的特定狀態的功能,然後在過程被中止時「倒回」到該點。

2

使用:非常非常快速。

用法:
我曾經使用堆管理作爲粗略的垃圾回收器(沒有析構函數)。有一段代碼沒有考慮到內存管理(使用一個單獨的堆)而做了一些工作。然後,當它完成時,我們只是摧毀堆重新索要所有的內存。

0

您可能還會爲每個線程專用一個堆 - 用於引用的局部性或減少鎖定(當跨多個線程共享堆時,這是必需的)。

1

一種用於固定大小的物體。如果您需要大量分配/取消分配所有大小相同的對象(即小型消息緩衝區),則私有堆可避免碎片問題。

+0

即你使用低fragmenetation堆,這也是更快。 – gbjbaanb 2010-10-21 12:39:59

3

在罕見情況下唯一重要的原因之一,但在那裏非常重要:由new/malloc分配的內存在現代Windows系統上不可執行。因此,如果您編寫例如JIT,則必須使用HeapCreateHEAP_CREATE_ENABLE_EXECUTE

相關問題