ブール値が1ビットのみを必要とするのにコンピューターの内部にバイトとして保存されるのはなぜですか


32

私は最近、コードを書くことを学び始めましたが、私の本でこの質問に出会いました。「1ビットしか必要としないのに、なぜブール値がコンピューターの内部にバイトとして保存されるのですか?」誰かがこの質問にもっと光を当てることができますか?


10
これは厳密には真実ではありません。一部の言語(C / C ++など)は、これらのビットが単一バイトにバンドルされている場合、ブール値を単一ビットとして格納する方法を提供します。つまり、Cでは、1バイトに8つのブール値を格納できます。ただし、メモリが安価であり、プロセッサが8/16/32/64ビットチャンクでデータを操作するため、これを使用することはほとんどありません。
ロボット

同様の質問に対するこの答えは、あなたが見るべきものです!あなたはそこに巨大な参照を得るでしょう...乾杯!
サム


回答:


49

CPUが簡単に対処できることと関係があります。たとえば、x86プロセッサにはeax(32ビット)、ax(16ビット)、ah(8ビット)がありますが、単一ビットのレジスタはありません。したがって、単一ビットを使用するためには、CPUは値を変更するために読み取り/変更/書き込みを行う必要があります。バイトとして格納されている場合、単一の読み取りまたは書き込みを使用して値を検査/変更できます。

さらに、すべてのバイトが7ビットを無駄にした後、フルバイトよりもシングルビットを使用する方が良いのではないかと思うかもしれません。少なくともx86と他の人は思うが、通常は1ビットの読み取り/変更/書き込みよりもはるかに速いブールをすばやく設定/クリアするための指示があるため、スペースが制約にならない限り、1つはそのバイトに行くべきです。 。個人的な測定から、読み取り/変更/書き込みの方法は、単一命令の方法よりも5倍遅いことがわかりました。


6
あなたが不足している唯一の単語は「境界整列」です。
マノジR

3
一方、個々のビットを使用することで2倍の速度向上が見られました。これは、おそらく、より小さなデータセットでのキャッシュの使用が改善されたためです。
マイケルボルグワード

5

@ barrem23が説明するように、データはアドレス可能でなければならず、従来のアーキテクチャの最小の境界はバイトです。

しかし、この質問はとしてタグ付けされてstd::vector<bool>いるため、個々の要素をビットとして保存できるように特化されていることを指摘する価値があります。これは、一部の機能を犠牲にすることでスペースを節約します(たとえば、機能しstd::searchない場合があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.