是否可以压缩VC++;运行时堆? 我能和VisualC++运行时堆有相同的效果吗?我怎样才能做到这一点呢?
IIRC必须编写自己的内存管理器。这也是一项不平凡的工作,尤其是如果您希望做的不仅仅是将相邻的较小的空内存块组合成较大的内存块。IIRC必须编写自己的内存管理器。这也是一项非常重要的工作,尤其是如果您希望做的不仅仅是将相邻的较小的空内存块组合成较大的内存块。您可以使用_get\u heap\u HANDLE获得CRT堆的句柄,然后调用HeapCompact。不确定是否支持/稳定,因为我自己没有尝试过。我想您可能希望在序列化模式下调用HeapCompact,以便有机会实现这一点是否可以压缩VC++;运行时堆? 我能和VisualC++运行时堆有相同的效果吗?我怎样才能做到这一点呢?,c++,visual-c++,memory-management,runtime,heap,C++,Visual C++,Memory Management,Runtime,Heap,IIRC必须编写自己的内存管理器。这也是一项不平凡的工作,尤其是如果您希望做的不仅仅是将相邻的较小的空内存块组合成较大的内存块。IIRC必须编写自己的内存管理器。这也是一项非常重要的工作,尤其是如果您希望做的不仅仅是将相邻的较小的空内存块组合成较大的内存块。您可以使用_get\u heap\u HANDLE获得CRT堆的句柄,然后调用HeapCompact。不确定是否支持/稳定,因为我自己没有尝试过。我想您可能希望在序列化模式下调用HeapCompact,以便有机会实现这一点 如果遇到此问题,只
如果遇到此问题,只需调用句柄上的HeapSetInformation(根据_get_heap_handle上的MDSN文档),并让内置LFH为您处理压缩。您可以使用_get_heap_handle获取CRT堆的句柄,然后调用HeapCompact。不确定是否支持/稳定,因为我自己没有尝试过。我想您可能希望在序列化模式下调用HeapCompact,以便有机会实现这一点
如果遇到此问题,只需在句柄上调用HeapSetInformation(根据_get _heap _handle上的MDSN文档),并让内置LFH为您处理压缩。您所说的“运行时堆”是什么意思?还有哪一种?@Neil Butterworth:我指的是malloc()使用的那一种。在Win32中,程序可以使用HeapCreate()创建额外的堆。出于兴趣,是否有一个惊人的好理由说明自由块合并不会自动发生?“运行时堆”是什么意思?还有哪一种?@Neil Butterworth:我指的是malloc()使用的那一种。在Win32中,程序可以使用HeapCreate()创建额外的堆。出于兴趣,是否有一个惊人的好理由说明自由块合并不会自动发生?事实上,合并相邻块是HeapCompact()唯一的功能。如果没有更好的主意,您必须这样做。是的,内存分配失败的一个原因是堆碎片。如果
malloc()
返回NULL
,您可以尝试HeapCompact(GetProcessHeap(),0)
,交叉手指,然后再次malloc()
。实际上,这是一个糟糕的解决方案,但在时间紧迫时可能会有所帮助。您应该真正优化/更改程序的内存分配策略,例如使用内存映射文件(和)。事实上,合并相邻块是HeapCompact()唯一能做的事情。如果没有更好的主意,您必须这样做。是的,内存分配失败的一个原因是堆碎片。如果malloc()
返回NULL
,您可以尝试HeapCompact(GetProcessHeap(),0)
,交叉手指,然后再次malloc()
。实际上,这是一个糟糕的解决方案,但在时间紧迫时可能会有所帮助。您应该真正优化/更改程序的内存分配策略,例如使用内存映射文件(和)。