私が読んでいるのはC++プログラミング言語その中でStroustrupはsizeof(char) == 1
と1 <= sizeof(bool)
と述べています。詳細は実装によって異なります。ブール値のような単純な値がcharと同じスペースを取るのはなぜですか?
最新のコンピュータアーキテクチャでは、バイトはアドレス可能なメモリの最小単位です。複数のビットを1バイトにパックするには、追加のビットシフト演算を適用する必要があります。コンパイラレベルでは、メモリと速度の要件のトレードオフになります(また、高性能ソフトウェアでは、これらの余分なビットシフト操作により、アプリケーションが不必要に加算され、速度が低下する可能性があります)。
C++ではブール値のアドレスを取得でき、ほとんどのマシンは個々のビットをアドレス指定できないためです。
メモリに書き込むことができる最小のスペースは1バイトであるため、同じスペースが必要です。両方の値が1バイトに格納されます。理論的にはブール値を示すのに1ビットしか必要ありませんが、値を格納するには1バイト全体が必要です。
理論的には、ブール値に必要なのは1ビットだけですが、1バイト未満のデータを処理するのは面倒です。あなたは何かを達成するためにもっと多くの指示が必要であり、あなたは本当に利益を得ません。
複数のブール値を1バイトにパックする場合は、 ビットフィールド構造 を使用できます。
バイトは、アドレス可能なメモリの最小単位です。
次のコードについて考えてみます。
bool b[9];
bool *pb0 = &b[0];
bool *pb1 = &b[1];
for (int counter=0; counter<9; ++counter)
{
// some code here to fill b with values
b[counter] = true;
}
Boolが1ビットとして格納されている場合、両方のアドレスが同じであるため、pb0はpb1と等しくなります。これは明らかに望ましくありません!
さらに、ループ内での割り当てにより、重要なアセンブリコードが生成されます。これには、ループの各反復で異なるビットシフトが含まれます。高性能ソフトウェアでは、これらの余分なビットシフト操作により、アプリケーションの速度が不必要に遅くなる可能性があります。
STLライブラリは、スペースが重要な状況での回避策を提供します。 std :: vector <bool>を使用すると、boolが1ビットとして格納されます。上記の例のパラドックスは当てはまりません。
実際、私が知っているほとんどの実装では、sizeof(bool)== sizeof(int)です。 「int」は、CPUが処理するのに最も効率的なデータサイズを意味します。したがって、特定のサイズを持たないもの( "char"など)は、intと同じサイズです。オブジェクトごとに多数ある場合は、ストレージ用にパックする手段を実装することをお勧めしますが、通常の計算では、ネイティブサイズのままにしておく必要があります。