回答:
CPUが1バイトよりも小さいものに対処できないためです。
bt、bts、btrとbtc することができ、単一のビットに対応!
btバイトオフセットをアドレス指定し、指定されたオフセットでビットをテストすると思いますが、アドレスをバイト単位で指定すると、ビットオフセットリテラルは少し冗長になります(しゃれを除く)。
ウィキペディアから:
歴史的に、1バイトはコンピューターでテキストの単一の文字をエンコードするために使用されるビット数でした。このため、多くのコンピューターアーキテクチャーで基本的なアドレス指定可能な要素です。
バイトがあるので、基本的にアドレス可能なユニットは、その下のコンピュータ・アーキテクチャは、アドレスすることはできません。また、4ビットバイトをサポートするコンピューターは(おそらく)存在しないため、4ビットなどはありません。 bool
ただし、基本的なアドレス可能ユニットとして4ビットをアドレス指定できるこのようなアーキテクチャを設計できる場合bool、そのコンピュータでのみ4ビットのサイズになります。
intとchar私のポストから。
boolだからです。少なくとも1の値が必要であり、隣接するオブジェクトはC ++で独自のアドレスを持っている必要があるため、実装ではオブジェクトを大きくしてメモリを浪費する必要があります。そのため、ビットフィールドは特殊なケースとして存在します。構造体のビットフィールドメンバーは個別にアドレス指定できる必要はないため、aよりも小さくすることができます(ただし、構造体全体はまだ可能ではありません)。charsizeof(bool)boolchar
charC ++でアドレス可能な最小単位であると記載されている言語仕様からの参照を教えていただけますか?
sizeof(bool)に0.5 にすることはできません:-)私は実装が拡張としてサブバイトポインターを合法的に提供できると思いますが、通常の方法で割り当てられたboolのような「通常の」オブジェクトは標準が言うことをしなければなりません。
最も簡単な答えは、これは、CPUがメモリをビット単位ではなくバイト単位でアドレス指定し、ビット単位の操作が非常に遅いためです。
ただし、C ++でビットサイズの割り当てを使用することは可能です。ビットベクトル用のstd :: vector特殊化があり、ビットサイズのエントリを取る構造体もあります。
昔は猛烈な吹雪の中を登り、両坂を登らなければならなかった昔、昼食は学校の後ろの森の中を追跡し、素手で殺すことができる動物だったのですが、コンピュータに利用できるメモリは今日。私が今まで使った最初のコンピュータには6KのRAMがありました。6メガバイトではなく、6ギガバイトではなく、6キロバイト。その環境では、できるだけ多くのブール値をintにパックすることは非常に理にかなっているので、定期的に操作を使用してブール値を取り出して配置しました。
今日、人々が1 GBのRAMしか持っていないと嘲笑し、200 GB未満のハードドライブを見つけることができる唯一の場所が骨董品店であるとき、ビットを詰めるのは面倒なことではありません。
bool1バイトにすることができます-CPUのアドレス可能な最小サイズ、またはそれより大きくすることができます。パフォーマンスのためにのboolサイズである必要があるのは珍しいことではありませんint。特定の目的(ハードウェアシミュレーションなど)でNビットの型が必要な場合は、そのライブラリを見つけることができます(たとえば、GBLライブラリにはBitSet<N>クラスがあります)。bool(おそらく大きなコンテナーがある場合)のサイズが気になる場合は、自分でビットをパックするか、それを使用std::vector<bool>してそれを実行できます(コンテナーの要件を満たさないため、後者に注意してください)。
なぜなら、MIPSのような一部のCPUは4バイトワードを使用しますが、一般的に、CPUは1バイトを基本単位としてメモリを割り当てます。
ただし、特別な方法でvector処理さboolれ、vector<bool>ブールごとに1ビットが割り当てられます。
lw/ swがはるかに広く使用されています。
バイトは、コンピューターのデジタルデータストレージの小さな単位です。コンピューターでは、RAMに数百万バイトがあり、それらの誰もがアドレスを持っています。それがすべてのビットのアドレスを持っている場合、コンピュータはそれができるものより8倍少ないRAMを管理することができます。
詳細:ウィキペディア
可能な最小サイズが1バイトの場合でも、1バイトに8ビットのブール情報を含めることができます。
http://en.wikipedia.org/wiki/Bit_array
たとえばJulia言語にはBitArrayがあり、C ++の実装について読んだ。
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };。ほとんどのコンパイラはfullを割り当てunsigned intますが、読み取り/書き込みの際にビットトゥイドルリングを自分で処理します。また、モジュロ演算を自分で処理します。これはunsigned small : 4属性の値が0〜15で、16に到達する必要がある場合、前のビットは上書きされません:)