2017-04-13 58 views
2

我正在學習Windows中的內存管理。我知道Windows中的進程默認有堆,可以在將來擴展。此外,流程可以創建更多(私人)堆。爲什麼Windows允許創建私有堆?這種方法有什麼好處?據我瞭解使用默認堆(可能重新分配)就足夠了。或者也許是另一種優化重新分配的方法?爲什麼Windows允許創建私有堆?

+0

能夠調用'HeapDestroy'來立即釋放你不再需要的所有東西(而不是單獨花費大量的步行來釋放對象)是一大好處。或者,正如[MSDN上的一篇文章指出的那樣](https://msdn.microsoft.com/library/ms810603),「[...]堆內存的一個好處是它能夠很好地滿足傳統數據的需求結構如二叉樹,鏈表和動態數組,具有堆句柄提供了一種獨立地識別這些結構的方法。「 –

+2

[這是一個故事](https://blogs.msdn.microsoft.com/ricom/2006/02/02/unmanaged-memory-fragmentation-an-old-story/),它顯示了真正使用私有堆世界場景:減少線程爭用並減少碎片。 –

回答

3

如果你看看HeapCreate,你會發現它有多個選項可以改變堆的工作方式。 HEAP_NO_SERIALIZE將使它更快,但你必須處理自己的線程同步等。

如果您分配具有不同生存期的不同大小的對象,則擁有多個堆也是有益的。如果您還有大量的小型對象被分配和取消分配作爲您的工作的一部分以減少碎片(並且在多線程中鎖定爭用),那麼您可能希望將大型長生命週期對象放在自己的堆上。

正如評論中指出的那樣,您可以撥打HeapDestroy在一次調用中釋放每個分配和堆本身,但這隻有在您完全控制分配的所有內容時纔有意義。您不允許銷燬默認堆,因此您必須創建自己的私有堆才能使用此技巧。