我正在编写一个 C++ 程序,它基本上适用于非常大的数组。在 Windows 上,我使用 VirtualAlloc 为我的数组分配内存。现在我完全理解了使用 VirutalAlloc 保留和提交内存的区别;但是,我想知道将内存逐页提交到保留区域是否有任何好处。特别是,MSDN ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887(v=vs.85).aspx ) 包含对 MEM_COMMIT 选项的以下解释:
除非/直到实际访问虚拟地址,否则不会分配实际的物理页面。
我的实验证实了这一点:我可以保留和提交几 GB 的内存,而不会增加我的进程的内存使用量(如任务管理器中所示);只有当我实际访问内存时才会分配实际内存。
现在我看到了很多例子,他们认为应该保留大部分地址空间,然后逐页提交内存(或在一些更大的块中,取决于应用程序的逻辑)。然而,正如上面所解释的,在访问内存之前似乎并没有提交内存。因此,我想知道逐页提交内存是否有任何真正的好处。事实上,由于许多系统调用实际提交内存,逐页提交内存实际上可能会减慢我的程序速度。如果我一次提交整个区域,我只需支付一个系统调用,但内核似乎足够聪明,实际上只分配我实际使用的内存。
如果有人能向我解释哪种策略更好,我将不胜感激。