33

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

4

7 に答える 7

69

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

于 2008-11-05T22:00:12.087 に答える
23

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

于 2008-11-05T22:02:22.707 に答える
12

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

于 2008-11-05T21:56:20.440 に答える
5

理論的には、bool には 1 ビットしか必要ありませんが、1 バイト未満のデータを扱うのは面倒です。何かを達成するには、さらに指示が必要ですが、実際にはメリットがありません。

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

于 2008-11-05T21:56:45.073 に答える
3

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

次のコードを検討してください。

    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 []のオーバーロードは、ビットシフト操作の厳密さを隠します
  • ポインターの代わりにイテレーターを使用すると、実装に柔軟性が追加されます
于 2008-11-06T11:17:24.987 に答える
2

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

于 2008-11-05T22:04:01.313 に答える
2

C++ には vector と呼ばれるものがあり、理論的には 8 つの bool を 1 つの文字に格納できるという事実を悪用しようとしますが、C++ 標準委員会はこれを誤りと広く見なしています。本「Effective stl」には、実際には「使用しないでください」と書かれています。いかに難しいかがわかるはずです。

ところで: Knuth には、ビット単位の操作に特化した本があります。Boost には、よりメモリ効率の良い方法で大量のビットを処理する専用のライブラリもあります。

于 2008-11-05T22:09:03.487 に答える