我需要使用大对齐(也可能在兆字节范围内)分配大的内存区域(兆字节)。 VirtualAlloc系列函数似乎没有提供执行此操作的选项。
我在Linux上为实现这一点而做的是mmap一个更大的区域 - 足够大以保证包含所需对齐的足够大的区域 - 然后在区域的开头和结尾处对这些区域进行munmap。不需要的大区域。
作为一个例子,假设我需要4兆字节,在1兆字节边界上对齐(即在最低20位中具有零的区域的起点)。我想要5兆字节。假设我得到区域0x44ff000-0x49ff000。在该区域内包含区域0x4500000-0x4900000,该区域在1兆字节边界上对齐。然后我会发布电子邮件0x44ff000-0x4500000和0x4900000-0x49ff000。
我可以在Win32上做类似的事情吗?如果我将VirtualProtect与PAGE_NOACCESS一起使用,是否会释放内存?有更好的解决方案吗?
答案 0 :(得分:6)
是的,您可以使用相同的技术。 VirtualAlloc
范围为MEM_RESERVE
。找到经过适当对齐的子范围,然后使用VirtualAlloc
在子范围内再次拨打MEM_COMMIT
。
答案 1 :(得分:0)
在windows / MSVC crt中查看_aligned_malloc
的来源,使用相同的方法来对齐虚拟内存非常简单,我甚至可以说,只需要替换它内部malloc
调用(同样适用于_aligned_free
),这允许仅使用单个系统调用进行分配。
但是,为什么需要如此大规模的对齐?您是否试图滥用快速内存块平板的地址位模式?