Windows API具有一组用于堆创建和处理的函数:HeapCreate,HeapAlloc,HeapDestroy等。 我想知道程序中另一个堆的用途是什么? 从碎片的角度来看,您将获得外部碎片,其中内存不会在堆中重复使用。因此,即使使用了低碎片堆,也存在碎片。 额外堆的内存管理似乎是低级别的。所以它们不容易使用。 此外,可以使用堆中的分配和管理分配的内存来模拟其他堆。
那么用法是什么?你用过它吗?
答案 0 :(得分:5)
一个用例可能是一个长期运行的复杂过程,它会执行大量内存分配和释放。如果用户想要中断该过程,那么清理当前分配的内存的一种简单方法可能是将所有内容放在私有堆上,然后简单地销毁堆。
我已经看到这种技术在嵌入式系统中使用(不使用Windows,所以它没有使用那些确切的API函数)。自定义内存分配器具有“标记”堆的特定状态的功能,然后在进程中止时“回放”到该点。
答案 1 :(得分:4)
其中一个原因仅在极少数情况下很重要,但在那里非常重要:new/malloc
分配的内存在现代Windows系统上无法执行。因此,如果您编写例如JIT,则必须将HeapCreate
与HEAP_CREATE_ENABLE_EXECUTE
一起使用。
答案 2 :(得分:3)
使用:非常非常非常狂热。
用法:
我曾经在一个预测中使用堆管理作为原油垃圾收集器(没有析构函数)。有一部分代码在没有考虑内存管理(使用单独的堆)的情况下完成了一些工作。然后,当它完成时,我们只是销毁了那堆以重新声明所有内存。
答案 3 :(得分:2)
一种用途是固定尺寸的物体。如果您需要对大小相同的对象(即小消息缓冲区)进行大量分配/释放,则私有堆可以避免碎片问题。
答案 4 :(得分:0)
您也可以为每个线程专用一个堆 - 用于引用的局部性或减少锁定(在跨线程共享堆时需要)。
答案 5 :(得分:0)
我经常看到的一个用例是恶意软件。
恶意软件在其.rsrc
部分的某处会有一个压缩二进制文件,分配一个可执行的私有堆,然后在那里运行代码。它是非常有效的技术
答案 6 :(得分:0)
此处未提及的一个用法是avoid heap contention。
您可以创建一个非线程安全的线程本地堆,将HEAP_NO_SERIALIZE
标志传递给HeapCreate
。
由于只有一个线程可以访问堆,因此不需要锁定,并且可以减轻争用。