2010-03-10 58 views
0

对于Visual C++运行时堆,我可以获得与HeapCompact()相同的效果吗?我怎样才能做到这一点?是否可以压缩VC++运行时堆?

+0

“run-time heap”是什么意思?还有什么其他的? – 2010-03-10 10:14:44

+0

@Neil Butterworth:我的意思是malloc()使用的那个。在Win32中,程序可以使用HeapCreate()创建更多的堆。 – sharptooth 2010-03-10 10:23:18

+0

出于兴趣,是否有一个令人惊讶的好理由,即自由块合并不会自动发生? http://msdn.microsoft.com/en-us/library/cc265897.aspx – 2010-03-10 11:27:57

回答

2

您可以使用_get_heap_handle获取CRT堆的HANDLE,然后调用HeapCompact。不确定这是否支持/稳定,因为我自己没有尝试过。我想你会想在序列化模式下调用HeapCompact来让这个工作有任何机会。

如果您打算遇到这个问题,只需调用句柄上的HeapSetInformation(_get_heap_handle上的每个MDSN文档),并让内置的LFH为您处理压缩。

2

IIRC不是没有编写自己的内存管理器。这也是一件不平凡的工作,尤其是如果您希望不仅仅将相邻较小的空白内存块组合成较大的内存块,而且还要做更多的工作。

+0

实际上,组合相邻的块是HeapCompact()唯一的功能。 – sharptooth 2010-03-10 13:37:32

+1

你必须*真的*需要这样做,因为没有更好的主意。 – Spike 2010-03-10 14:24:35

+0

是的,内存分配失败的一个原因是堆碎片。在'malloc()'返回'NULL'的情况下,你可以尝试'HeapCompact(GetProcessHeap(),0)',再次交叉你的手指,然后再'malloc()'。其实这是一个糟糕的解决方案,但当时间紧迫时它可能会有所帮助。您应该真正优化/改变程序的内存分配策略,例如使用内存映射文件([link1](http://msdn.microsoft.com/en-en/library/dd997372.aspx)和[link2](http://en.wikibooks.org/wiki/Optimizing_C%2B %2B/General_optimization_techniques /输入/输出#内存mapped_file所))。 – 2012-09-05 12:36:24