3

我需要分配大内存区(兆字节)大对齐(也可能在兆字节范围内)。 VirtualAlloc系列函数似乎没有提供选项来执行此操作。Win32内存分配与大对齐

我在Linux上做什么来达到这个目的是为了映射一个更大的区域 - 足够大以保证具有所需对齐的足够大的区域将被包含在其中 - 然后在区域的开始和结束处munmap大的地区是不需要的。作为一个例子,假设我需要4兆字节,在1兆字节边界上对齐(即,在最低20位中具有零的区域的开始)。我会mmap 5兆字节。比方说,我得到区域0x44ff000-0x49ff000。在该区域内包含区域0x4500000-0x4900000,该区域在1兆字节的边界上对齐。然后,我会munmap 0x44ff000-0x4500000和0x4900000-0x49ff000。

我可以在Win32上做类似的事吗?如果我用PAGE_NOACCESS使用VirtualProtect,内存是否会被释放?有更好的解决方案吗?

+0

对* virtual *内存的对齐要求非常奇怪,这只对物理内存很重要。 Anyhoo,在Windows上无法做到。但这并不重要,因为您只需*保留*分配。承诺是一个单独的步骤。请求分配特定开心地址也是可能的。使用VirtualAlloc()。 –

回答

6

是的,你可以使用相同的技术。 VirtualAlloc大范围为MEM_RESERVE。找到适当对齐的子范围,并在MEM_COMMIT的子范围上第二次调用VirtualAlloc

0

在windows/MSVC crt中查看_aligned_malloc的源代码,它使用相同的方法来调整虚拟内存非常简单,我甚至可以说,只需更换其内部的malloc调用(同样适用于_aligned_free),这允许仅分配一个单个系统调用

但是,为什么你需要这种大规模的对齐?您是否试图滥用快速内存​​块地址位模式?