2

sizeof演算子をテストする小さなコンソール アプリケーションを作成しました。

public class Program
{
    public static unsafe void Main(string[] args)
    {
        // Native
        Console.WriteLine("The size of bool is {0}.", sizeof(bool));
        Console.WriteLine("The size of short is {0}.", sizeof(short));
        Console.WriteLine("The size of int is {0}.", sizeof(int));
        Console.WriteLine("The size of long is {0}.", sizeof(long));

        // Custom
        Console.WriteLine("The size of Bool1 is {0}.", sizeof(Bool1));
        Console.WriteLine("The size of Bool2 is {0}.", sizeof(Bool2));
        Console.WriteLine("The size of Bool1Int1Bool1 is {0}.", sizeof(Bool1Int1Bool1));
        Console.WriteLine("The size of Bool2Int1 is {0}.", sizeof(Bool2Int1));
        Console.WriteLine("The size of Bool1Long1 is {0}.", sizeof(Bool1Long1));
        Console.WriteLine("The size of Bool1DateTime1 is {0}.", sizeof(Bool1DateTime1));

        Console.Read();
    }
}

public struct Bool1
{
    private bool b1;
}

public struct Bool2
{
    private bool b1;
    private bool b2;
}

public struct Bool1Int1Bool1
{
    private bool b1;
    private int i1;
    private bool b2;
}

public struct Bool2Int1
{
    private bool b1;
    private bool b2;
    private int i1;
}

public struct Bool1Long1
{
    private bool b1;
    private long l1;
}

public struct Bool1DateTime1
{
    private bool b1;
    private DateTime dt1;
}

次の出力が得られます。

結果のサイズ

フィールドが宣言される順序は、構造体のサイズに影響を与えるようです

Bool1Int1Bool1サイズ6 (1 + 4 + 1) が返されることを期待していましたが、代わりに12が返されます ( 4 + 4 + 4 だと思いますか??) ! そのため、コンパイラは、すべてを 4 バイトずつパックしてメンバーを整列させているようです。

32 ビットまたは 64 ビットのシステムを使用している場合、何かが変わりますか?

そして 2 番目の質問は、long型を使用したテストの場合、今回boolは 8 バイトでパックされています。誰がこれを説明できますか?

4

2 に答える 2