【问题标题】:Win32 memory allocation with large alignment大对齐的 Win32 内存分配
【发布时间】:2011-11-28 19:47:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 虚拟内存有对齐要求是很奇怪的,这只对物理内存很重要。 Anyhoo,在 Windows 上是不行的。但这没关系,因为您只需要reserve 分配。提交是一个单独的步骤。也可以请求分配特定的快乐地址。使用 VirtualAlloc()。

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


【解决方案1】:

是的,您可以使用相同的技术。 VirtualAllocMEM_RESERVE 的范围很大。找到适当对齐的子范围,并在具有MEM_COMMIT 的子范围上再次调用VirtualAlloc

【讨论】:

    【解决方案2】:

    在 windows/MSVC crt 中查看_aligned_malloc 的来源,使用相同的方法对齐虚拟内存非常简单,我什至会说,只需替换其内部 @ 987654322@ 调用(_aligned_free 也是如此),这允许仅使用 single 系统调用进行分配。

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

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 2014-02-28
      • 1970-01-01
      • 2011-04-29
      • 2012-10-08
      • 1970-01-01
      • 2017-04-15
      • 2011-12-30
      相关资源
      最近更新 更多