"系统分配内存时,首地址必须是分配粒度(64K)的整数倍。"
还以为这里的粒度是翻译不到位,翻了原文,allocation granularity,确确实实是粒度,没错。
在嗷酱和嘟酱的帮助下发现原来是酱紫的:
http://blogs.msdn.com/b/oldnewthing/archive/2003/10/08/55239.aspx
LPVOID
WINAPI
VirtualAlloc(
LPVOID lpAddress,
SIZE_T dwSize,
DWORD flAllocationType, // MEM_RESERVE,预订区域而不是调拨物理存储器
DWORD flProtect
);
// 从高地址预订内存地址,可以避免可能会引起的内存碎片。
// 如果想要尽可能从高地址预订区域,必须
// lpAddress = NULL
// flAllocationType= MEM_RESERVE|MEM_TOP_DOWN
SIZE_T GetLargePageMinimum(); // 获得大页面分配粒度
大页面会得到更好的性能是因为Windows认为MEM_LARGE_PAGE标志分配得到的内存是不可换页的unpagable.