web-dev-qa-db-ja.com

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

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

32
Mr. 1.0

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

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

49
barrem23

@ barrem23で説明 、データはアドレス指定可能である必要があり、従来のアーキテクチャの最小境界はバイトです。

ただし、この質問には c ++ のタグが付けられているため、std::vector<bool>専門化されていることを許可することを指摘する価値があるかもしれません ビットとして格納される個々の要素 。これは、一部の機能を犠牲にすることでスペースを節約します(たとえば、std::searchは機能しない可能性があります)。

5
chrisaycock