8

私はMarshal.GlobalHAllocメモリを割り当てるために使用します。ドキュメントにあるように、「このメソッドは、Kernel32.dllからWin32LocalAlloc関数を公開します。」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 に答える