6

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

为了实现这一点,我在 Linux 上所做的是映射一个更大的区域 - 足够大以保证其中包含具有所需对齐的足够大的区域 - 然后 munmap 大区域开头和结尾的区域不需要。

例如,假设我需要 4 兆字节,在 1 兆字节边界上对齐(即,最低 20 位为零的区域的开始)。我会映射 5 兆字节。假设我得到区域 0x44ff000-0x49ff000。在该区域内包含区域 0x4500000-0x4900000,它在 1 兆字节边界上对齐。然后我会 munmap 0x44ff000-0x4500000 和 0x4900000-0x49ff000。

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

4

2 回答 2

8

是的,您可以使用相同的技术。VirtualAlloc大范围为MEM_RESERVE。找到适当对齐的子范围,并VirtualAlloc使用 再次调用该子范围MEM_COMMIT

于 2011-10-01T01:06:40.143 回答
0

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

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

于 2011-10-01T05:55:26.120 回答