2012-11-16 24 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); 
関連する問題