質問

C ++プログラミング言語を読んでいます。 Stroustrupには、sizeof(char) == 1および1 <= sizeof(bool)と記載されています。詳細は実装に依存します。ブール値などの単純な値が文字と同じスペースを取るのはなぜですか?

役に立ちましたか?

解決

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

他のヒント

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

メモリに書き込むことができる最小のスペースは1バイトなので、同じスペースを使用します。両方の値は1バイトに格納されます。理論的には、ブール値を表すのに1ビットのみが必要ですが、値を格納するには1バイト全体が必要です。

理論的には、boolには1ビットしか必要ありませんが、1バイト未満のデータを扱うのは面倒です。何かを達成するためにより多くの指示が必要であり、あなたは本当に利益を得ません。

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

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

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

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

    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 <!> lt; bool <!> gt;の使用boolを1ビットとして保存します。上記の例のパラドックスは当てはまりません。

  • operator []のオーバーロードにより、ビットシフト操作の厳密さが隠されます
  • ポインタの代わりにイテレータを使用すると、実装に柔軟性が追加されます
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top