1

重複の可能性:
Marshal.SizeOf 構造体が過剰な数を返す

MSDNが述べているように、これsizeof(bool)1バイトです。しかし、 struct に bool を入れると、 sizeof struct は4バイトになります。誰かがこの動作を説明できますか?

[StructLayout(LayoutKind.Sequential)]
public struct Sample1
{
    public bool a1;
}

int size1 = Marshal.SizeOf(typeof (Sample1));  // 4
int size2 = sizeof (bool);                     // 1
4

2 に答える 2

1

構造体/クラスを使用する場合、サイズは常に特定のサイズに揃えられます。アーキテクチャごとに異なる場合がありますが、通常は4であるため、ブール値の後にintがある場合は、4の乗算から開始し、プロセッサが4バイトを読み取るようにします。チャンク。
これは、クラス(または構造)のメンバーの順序を設定するときに考慮する価値のあるものです。

例:

[StructLayout(LayoutKind.Sequential)]
public struct Sample1
{
    public bool a1;//take 1 byte but align to 4
}
public struct Sample2
{
    public bool a1;//take 1 byte but align to 4
    public int  a2;//take 4 bytes (32bit machine) start at a multiplication of 4
    public bool a3;//take 1 byte but align to 4
}
public struct Sample3
{
    //here the compiler (with the right optimizations) can put all the bools one after the other without breaking the alignment
    public bool a1;
    public bool a2;
    public bool a3;
    public bool a4;
    public int  a5;
}
int size1 = Marshal.SizeOf(typeof (Sample1));  // 4
int size1 = Marshal.SizeOf(typeof (Sample2));  // 12
int size1 = Marshal.SizeOf(typeof (Sample3));  // 8
int size2 = sizeof (bool);                     // 1 
于 2012-11-08T09:29:06.267 に答える
1

sizeofとを直接比較することはできませんMarshal.SizeOf。たとえば、同じ方法で測定すると、同じ結果が得られます。

static unsafe void Main() { // unsafe is needed to use sizeof here
    int size1 = sizeof(Sample1); // 1
}

おそらくは、Marshalフィールドごとに 4 バイトのアラインメントを想定しています。

于 2012-11-08T09:22:41.423 に答える