重複の可能性:
c# のブール値のバイナリ表現は何ですか
MSDN のドキュメントによると、sizeof
キーワードは「アンマネージ型のサイズをバイト単位で取得するために使用されます」であり、プリミティブはアンマネージ型と見なされます。をチェックするsizeof(bool)
と、結果は 1 です。
ブール値を使用するには、少しのメモリしか必要ないように思えます。私は間違っていますか?値を使用するBoolean
には、実際に 1 バイトのメモリが必要ですか? なんで?
重複の可能性:
c# のブール値のバイナリ表現は何ですか
MSDN のドキュメントによると、sizeof
キーワードは「アンマネージ型のサイズをバイト単位で取得するために使用されます」であり、プリミティブはアンマネージ型と見なされます。をチェックするsizeof(bool)
と、結果は 1 です。
ブール値を使用するには、少しのメモリしか必要ないように思えます。私は間違っていますか?値を使用するBoolean
には、実際に 1 バイトのメモリが必要ですか? なんで?
パフォーマンス上の理由から、メモリ全体を使用します。
1 ビットしか使わなかった場合、残りの 7 ビットはどうしますか? ブール値の変数はほとんどなく、その他の変数は単一ビットを必要としない場合があります。したがって、他のブール値にのみ役立ちます。
たとえば、4 バイト整数。また、多くの大きな型は、パフォーマンス上の理由から、適切なバイト境界で開始する必要があります。たとえば、CPU では、任意のアドレスから始まる 4 バイト アドレスを簡単に参照できない場合があります (つまり、アドレスは 4 で割り切れる必要がある場合があります)。
単一ビットのメモリを使用した場合、つまり他の 7 ビットを他のブール値に使用できる場合、このブール値を使用しようとすると、より複雑になります。直接アドレス指定できないため、1 か 0 かをテストする前に、バイトを取得してからビットを抽出する必要があります。これは、より多くの命令を意味するため、パフォーマンスが低下します。
多くのブール値があり、それぞれに 1 ビットのメモリのみを使用させたい場合は、BitArray
. これらは、単一ビットのコンテナーです。それらはブール値の配列のように機能します。
1 バイトは、アドレス指定可能なメモリの最小量です。bool
.NET チームは、実装を簡素化するために、バイトを使用して を格納することにしました。
大量のビットをよりコンパクトに保存したい場合は、BitArray
.
はい、それは最小のアドレス可能なメモリであるため、フルバイトのメモリが必要です。
もちろん、複数のブール値を同じバイトに入れることができるスキームを考え出すことは可能であり、したがってスペースを節約できます。より多くの場合、そのようなソリューションのオーバーヘッドは、得られるよりもはるかに多くのコストがかかります。
格納するビット数が多い場合は、特殊なビット ベクトル (Mark Byers が言及した BitArray など) を使用すると、貴重なスペースを節約できます。
1 Byte を数値と考えると sizeof により 1 となります。では、どのように 1 ビットと言えますか? 不可能です。床に落ちて0を返しますが、それは不可能です。または、ビットで保存しないためにバイトを保存するために使用されるため、1を返します。
しかし、それがビットまたはバイトとして管理されているかどうかはわかりません。
C++ では、変数名に :1 を追加して、1 ビット幅にする必要があることを示します。