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

相关问题