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

时间:2012-11-16 08:58:52

标签: c# memory unmanaged

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

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

1 个答案:

答案 0 :(得分:12)

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

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