2つの値の型からなる単純な構造体を作成しました。値型のみを含むカスタム構造体でMarshal.SizeOf()メソッドを使用
public struct Identifier
{
public Guid ID { get; set; }
public Byte RequestType { get; set; }
}
は、それから私は、次の文を使用して、カスタム構造体Identifier
にMarshal.SizeOf()
メソッドを呼び出しました。
なぜMarshal.SizeOf()
が17を返さないのですか? 次の命令は、Guid
オブジェクトが16バイトで、バイトobject
が1バイトであることを示しています。アライメントの理由からアンマネージメモリにコピーしたときに
Guid g = Guid.NewGuid();
Console.WriteLine(Marshal.SizeOf(g)); // output: 16
Console.WriteLine(Marshal.SizeOf(g.GetType())); // output: 16
Byte t = 0;
Console.WriteLine(Marshal.SizeOf(t)); // output: 1
Console.WriteLine(Marshal.SizeOf(t.GetType())); // output: 1
構造体をメモリに配置するのはコンパイラではなく、CLRです。また、Marshal.SizeOfは、CLRによって整理された管理対象メモリのサイズではなく、アンマネージメモリ*にマーシャリングした後のサイズ*を返します。 – dtb
なぜメモリ内にあるときに構造体をワード境界に整列させたままにしたいのですか?パディングを無効にする結果は何ですか? – enzom83
@ enzom83: 'Identifier'の配列を持っていて、2番目の' Guid'にアクセスしたいとしたら、バイト整列ではないので、多段階読み込み(最初の単語の読み込み、2番目の単語の読み込み、所望のビットを組み合わせる)。 'StructLayout'を提供しないことによって、CLRにこれらの種類の詳細があなたにとって重要ではないことを伝えています。 – Guvante