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

8
我使用 Marshal.GlobalHAlloc 来分配内存,文档上说:“此方法公开了 Kernel32.dll 中的 Win32 LocalAlloc 函数。”GlobalAlloc 的文档说它将是 8 字节对齐的,但 LocalAlloc 没有说明对齐。比如说我要分配 1024 字节并确保它被 16 对齐。当我分配 1024+16 字节然后检查 pointer % 16 后是否为 0 时,这样做能够奏效吗?如果结果是 0 则表示内存已对齐,否则我只需增加指针以符合我的预期。问题是我不知道如果我有了对齐的指针,它是否真正对齐在物理内存中?
1个回答

17

所有的 Windows 堆分配器都按照 8 字节对齐。您可以通过超额分配并调整指针来解决这个问题,例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接