web-dev-qa-db-ja.com

C#のプリミティブブールサイズ

C#のブール変数はどのようにメモリに保存されますか?つまり、それらはバイトとして格納され、他の7ビットは無駄になりますか、または配列の場合は、ブールの1バイトのブロックにグループ化されていますか?

これはJava( Javaのブールプリミティブサイズが定義されていないのはなぜですか? )に関する同じ質問に答えます。JavaとC#は同じですこの点について?

34
user278353

C#では、確かにbitsはデフォルトではパックされないため、複数のbool fieldsはそれぞれ1バイトを使用します。 BitVector32BitArray、または単にビット演算を使用して、このオーバーヘッドを減らすことができます。 変数として4バイトかかることを思い出しているようです(基本的にはint = Int32として処理されます)。

たとえば、次はiを4に設定します。

struct Foo
{
    public bool A, B, C, D;
}
static unsafe void Main()
{
    int i = sizeof(Foo);
}
32
Marc Gravell

C#では、配列またはフィールドに1バイトとして格納されますが、興味深いことに、ローカル変数の場合は4バイトです。 1バイトのboolは、Javaとは異なり.NETドキュメントのどこかで定義されていると思います。ローカル変数の4バイトの理由は、レジスタで32ビットを読み取るときにビットをマスクしないようにするためだと思います。それでも、sizeof演算子は1バイトを示します。これは、これが唯一の関連するサイズであり、他のすべては実装の詳細であるためです。

18
Stilgar