web-dev-qa-db-ja.com

C ++:boolが8ビット長なのはなぜですか?

C++では、ブール値がブール値を保持するのに1ビットだけで十分な(なぜ私のシステムでは)ブール型が8ビット長なのか疑問に思っていますか?

私はそれがパフォーマンス上の理由であると信じていましたが、レジスタが32または64ビット幅である32ビットまたは64ビットマシンでは、パフォーマンスの利点は何ですか?

それとも、これらの「歴史的」理由の1つにすぎませんか?

125
Jérôme

すべてのC++データ型はアドレス可能でなければならないためです。

単一ビットへのポインターをどのように作成しますか?できません。しかし、あなたはcanバイトへのポインタを作成します。したがって、C++のブール値は通常、バイトサイズです。 (それも大きくなる可能性があります。これは実装次第です。主なことは、アドレス指定可能でなければならないため、C++データ型を1バイトより小さくすることはできません)

214
jalf

メモリはバイトアドレス指定可能です。メモリから読み取ったバイトをシフトまたはマスクせずに、単一ビットをアドレス指定することはできません。これは非常に大きな理由だと思います。

38

booleanタイプは、通常アドレス可能なメモリの最小単位に従いますターゲットマシン(つまり、通常8ビットバイト)です。

メモリへのアクセスは常に「チャンク」です(複数の単語、これはハードウェアレベルでの効率、バストランザクション用です):ほとんどのCPUシステムではブールビットを「単独」でアドレス指定することはできません。もちろん、データがregisterに含まれると、多くの場合、ビットを独立して操作するための特別な命令があります。

このため、「ブール」ベースデータ型の使用効率を高めるために、"ビットパッキング"の手法を使用することが非常に一般的です。 enum(Cのような)のような2のべき乗コーディングの手法は良い例です。ほとんどの言語で同じ種類のトリックが見つかります。

更新:素晴らしい議論のおかげで、C++のdefinitionによってsizeof(char)==1に気づきました。したがって、「ブール」データ型のアドレス指定は、アドレス指定可能なメモリの最小単位にかなり結び付けられています(私の主張を補強します)。

18
jldupont

アドレス指定可能なメモリの最小量である8ビットについての答えは正しいです。ただし、一部の言語canブール値には1ビットを使用します。 Pascalがビット文字列としてセットを実装していることを覚えているようです。つまり、次のセットの場合:

{1, 2, 5, 7}

メモリにこれがあるかもしれません:

01100101

もちろん、必要に応じてC/C++でも同様のことができます。 (ブール値の束を追跡している場合、couldは理にかなっていますが、状況によって異なります。)

6
Benjamin Oakes

私はこれが古いことを知っていますが、私は2セントで投げると思いました。

ブール型またはデータ型を1ビットに制限すると、アプリケーションがメモリ破損の危険にさらされます。わずか1ビットのメモリ内のエラー統計をどのように処理しますか?

就職の面接に行ったところ、プログラムリーダーが私に言った声明の1つは次のとおりでした。その信号をできるだけ速くする必要があります。」

それは、概念とビット、バイト、エラー処理を理解しているかどうかを確認するためのテストでした。悪者が1ビットのメッセージを送信するのはどれほど簡単でしょうか。または、送信中にビットが逆になった場合にどうなりますか。

1
Cire

ブールフラグのビットパックに使用されるint1型を使用する組み込みコンパイラ(たとえば、Microchip MPU用のCCSシリーズのCコンパイラ)。これらの変数の設定、クリア、テストには単一命令のビットレベルの命令が使用されますが、他の回答に記載されている理由により、コンパイラーは他の操作(変数のアドレスの取得など)を許可しません。

1
EBlake