2017-04-13 64 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在一次调用中释放每个分配和堆本身,但这只有在您完全控制分配的所有内容时才有意义。您不允许销毁默认堆,因此您必须创建自己的私有堆才能使用此技巧。