3

可能重复:
VirtualAlloc 和 HeapAlloc 有什么区别?

我想预先分配一大块内存,比如 1gb 来实现内存池。Virtual Alloc 使用 4kb 的页面大小进行分配。在这种情况下使用 virtualalloc 比 new 有什么优势?在这种情况下不应该使用 new 还是使用 new over virtual alloc 有什么缺点?

4

1 回答 1

5

使用 VirtualAlloc,您可以保留 1gb 地址范围。稍后您可以根据需要提交其中的一部分 - 以便为给定的保留地址块分配实际的物理内存块。保留永远不会失败,而如果物理内存不足,提交可能会失败。实际上,对于 Windows 上的分页文件,这也应该总是成功的。

new 将保留并提交 1gb 块。

因此,如果您需要即时访问整个 1GB 块,请继续使用新的。

如果您一开始不需要访问整个 1GB 块,并且您可以编写算法以便它按需提交部分内存,那么 VirtualAlloc 可以优化您的内存消耗。

如果您出于您的目的考虑使用 VirtualAlloc,那么您可能会发现很难决定何时以及如何提交内存。我在 Jeffrey Richter 的书(Advanced Windows 3rd ed.)中找到的一种很好的方法是使用结构化异常处理。一旦您的代码触及未提交的内存异常,您所要做的就是捕获它,提交内存,然后告诉系统重试发生问题的指令。我从未尝试过,但据我所知,这就是堆栈的实际工作方式。

于 2012-04-15T21:21:16.560 回答