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