2012-11-16 56 views
7

我使用Marshal.GlobalHAlloc來分配內存。正如文檔所述:「此方法從Kernel32.dll公開Win32 LocalAlloc函數」。 GlobalAlloc的文檔說它將8字節對齊,但LocalAlloc不說關於對齊的任何內容。如何用16字節對齊分配內存?

例如,我想分配1024個字節,並確保它是由16對齊。分配1024 + 16字節時,它會工作,然後我檢查指針%16?如果結果爲0,這意味着內存對齊,當它不是0時,我只是增加指針以符合我的期望。問題是我不知道,如果我已經對齊指針它真的在物理內存中對齊?

回答

10

所有的Windows堆分配器由8對齊您可以通過修復過度分配和調整的指針,就像這樣:

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