作为Win64上某些代码的优化,我保留了4GB的地址空间,然后在该地址空间内提交了一定数量的MB(例如512MB)(最终从数组绑定检查删除中获得了巨大的性能提升,但那是一切都在旁边)。我的代码基本上是这样的:
LPVOID address = VirtualAlloc(null, FOUR_GB, MEM_RESERVE, PAGE_NOACCESS);
arrayAddress = VirtualAlloc(address, length, MEM_COMMIT, PAGE_READWRITE);
我团队中的某位人员最近阅读了一篇关于大页面需要较少TLB查找并且在某些情况下性能显着提升的论文,这似乎是尝试这一点的主要候选者。
然而,我正在阅读的内容让我觉得这可能不起作用。 MSDN说“大小和对齐必须是大页面最小值的倍数”。我可以很容易地确保长度是大页面最小值的倍数,但是我如何才能进行对齐?如果我可以将MEM_LARGE_PAGES标志传递给预留,我认为这将正确对齐它。但我已经读过你不能用MEM_RESERVE | MEM_LARGE_PAGES调用VirtualAlloc。
所以我的想法是我可以做我现在正在做的事情,但在预订期间使用FOUR_GB + GetLargePageMinimum()进行VirtualAlloc,然后在提交时将地址与GetLargePageMinimum()对齐,但这对我来说感觉不对。
有谁知道正确的方法呢?