web-dev-qa-db-ja.com

C ++でcharとboolが同じサイズであるのはなぜですか?

私が読んでいるのはC++プログラミング言語その中でStroustrupはsizeof(char) == 11 <= sizeof(bool)と述べています。詳細は実装によって異なります。ブール値のような単純な値がcharと同じスペースを取るのはなぜですか?

31
108

最新のコンピュータアーキテクチャでは、バイトはアドレス可能なメモリの最小単位です。複数のビットを1バイトにパックするには、追加のビットシフト演算を適用する必要があります。コンパイラレベルでは、メモリと速度の要件のトレードオフになります(また、高性能ソフトウェアでは、これらの余分なビットシフト操作により、アプリケーションが不必要に加算され、速度が低下する可能性があります)。

66
Cybis

C++ではブール値のアドレスを取得でき、ほとんどのマシンは個々のビットをアドレス指定できないためです。

20
Robert Gamble

メモリに書き込むことができる最小のスペースは1バイトであるため、同じスペースが必要です。両方の値が1バイトに格納されます。理論的にはブール値を示すのに1ビットしか必要ありませんが、値を格納するには1バイト全体が必要です。

12
Kibbee

理論的には、ブール値に必要なのは1ビットだけですが、1バイト未満のデータを処理するのは面倒です。あなたは何かを達成するためにもっと多くの指示が必要であり、あなたは本当に利益を得ません。

複数のブール値を1バイトにパックする場合は、 ビットフィールド構造 を使用できます。

5
Rob Walker

バイトは、アドレス可能なメモリの最小単位です。

次のコードについて考えてみます。

    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ビットとして格納されます。上記の例のパラドックスは当てはまりません。

  • operator []の過負荷は、ビットシフト演算の厳密さを隠します
  • ポインターの代わりにイテレーターを使用すると、実装に柔軟性が追加されます
2
sep

実際、私が知っているほとんどの実装では、sizeof(bool)== sizeof(int)です。 「int」は、CPUが処理するのに最も効率的なデータサイズを意味します。したがって、特定のサイズを持たないもの( "char"など)は、intと同じサイズです。オブジェクトごとに多数ある場合は、ストレージ用にパックする手段を実装することをお勧めしますが、通常の計算では、ネイティブサイズのままにしておく必要があります。

2
James Curran

ベクトルと呼ばれるC++には、理論的には1文字に8つのboolを格納できるという事実を利用しようとするものがありますが、C++標準委員会では間違いと広く見なされています。 「効果的なstl」という本には、実際には「使用しないでください」と書かれています。それはあなたにそれがどれほどトリッキーであるかについての考えを与えるはずです。

ところで:クヌースには book ビット演算専用です。 Boostには library もあり、よりメモリ効率の高い方法で多数のビットを処理することに専念しています。

2
David Nehme