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

apo*_*pse 7 c# memory unmanaged

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

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

Han*_*ant 12

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

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