8

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

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

4

1 回答 1

16

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

    var rawptr = Marshal.AllocHGlobal(size + 8);
    var aligned = new IntPtr(16 * (((long)rawptr + 15) / 16));
    // Use aligned
    //...
    Marshal.FreeHGlobal(rawptr);
于 2012-11-16T11:59:46.433 回答