具有大对齐的Win32内存分配

时间:2011-09-30 22:33:14

标签: winapi memory-management virtual-memory memory-alignment

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

我在Linux上为实现这一点而做的是mmap一个更大的区域 - 足够大以保证包含所需对齐的足够大的区域 - 然后在区域的开头和结尾处对这些区域进行munmap。不需要的大区域。

作为一个例子,假设我需要4兆字节,在1兆字节边界上对齐(即在最低20位中具有零的区域的起点)。我想要5兆字节。假设我得到区域0x44ff000-0x49ff000。在该区域内包含区域0x4500000-0x4900000,该区域在1兆字节边界上对齐。然后我会发布电子邮件0x44ff000-0x4500000和0x4900000-0x49ff000。

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

2 个答案:

答案 0 :(得分:6)

是的,您可以使用相同的技术。 VirtualAlloc范围为MEM_RESERVE。找到经过适当对齐的子范围,然后使用VirtualAlloc在子范围内再次拨打MEM_COMMIT

答案 1 :(得分:0)

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

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