如何使用16字节对齐分配内存?

我使用Marshal.GlobalHAlloc来分配内存。 正如文档所说:“此方法从Kernel32.dll公开Win32 LocalAlloc函数。” GlobalAlloc的文档说它将是8字节对齐,但LocalAlloc没有说任何关于对齐的内容。

例如,我想分配1024个字节,并确保它与16对齐。当我分配1024 + 16个字节然后检查指针%16时它会工作吗? 如果结果为0则意味着内存对齐,当它不为0时,我只是增加指针以符合我的期望。 问题是我不知道,如果我有对齐指针它真的在物理内存中对齐?

所有Windows堆分配器都按8对齐。您可以通过过度分配和调整指针来解决这个问题,如下所示:

  var rawptr = Marshal.AllocHGlobal(size + 8); var aligned = new IntPtr(16 * (((long)rawptr + 15) / 16)); // Use aligned //... Marshal.FreeHGlobal(rawptr);