Winapi 在VirtualAlloc中对齐内存

Winapi 在VirtualAlloc中对齐内存,winapi,virtual-memory,Winapi,Virtual Memory,作为对Win64上某些代码的优化,我将保留4GB的地址空间,然后在该地址空间中提交一些MB(例如512MB)(这最终会从删除数组绑定检查中获得巨大的性能改进,但这一切都无关紧要)。我的代码基本上如下所示: LPVOID address = VirtualAlloc(null, FOUR_GB, MEM_RESERVE, PAGE_NOACCESS); arrayAddress = VirtualAlloc(address, length, MEM_COMMIT, PAGE_READWRITE);

作为对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|u RESERVE | MEM|u LARGE|u页面调用VirtualAlloc

所以我的想法是,我可以做我现在正在做的事情,但在预订期间使用4_GB+GetLargePageMinimum()执行VirtualAlloc,然后在提交时将地址与GetLargePageMinimum()对齐,但我觉得这不对


有人知道正确的方法吗?

这是一个边缘案例,似乎微软没有预料到有人会这样做。因此,虽然我不确定,但我怀疑您提出的算法确实是实现这一点的唯一方法。据我所知,格拉斯哥哈斯克尔编译器运行时。请随意查看它们的实现。