C++では、
CPUのエミュレーターを作成するとき、上記のことを見逃しています
CPUは1バイトより小さいものには対応できないためです。
From Wikipedia :
歴史的に、バイトはコンピューターでテキストの1文字をエンコードするために使用されるビット数であり、このため多くの場合、基本的なアドレス可能な要素ですコンピュータアーキテクチャ。
したがって、バイトはthe基本的なアドレス可能ユニットであり、これより下ではコンピュータアーキテクチャはアドレス指定できません。また、(おそらく)4ビットバイトをサポートするコンピューターは存在しないため、4-bitbool
はありません。等.
ただし、4ビットを基本的なアドレス可能ユニットとしてアドレス指定できるアーキテクチャを設計できる場合、そのコンピューターでのみ、サイズが4ビットのbool
になります。
最も簡単な答えは;これは、CPUがメモリをビット単位ではなくバイト単位でアドレス指定し、ビット単位の操作が非常に遅いためです。
ただし、C++でビットサイズの割り当てを使用することは可能です。ビットベクトルにはstd :: vectorの特殊化があり、ビットサイズのエントリを取る構造体もあります。
昔、猛烈なブリザードで学校まで歩いて両方の道を登らなければならなかったとき、昼食は学校の後ろの森で追跡して素手で殺すことができる動物でしたが、コンピュータは今日。私が使用した最初のコンピューターには6KのRAMがありました。 6メガバイトでも、6ギガバイトでも、6キロバイトでもありません。その環境では、できるだけ多くのブール値をintにパックすることは非常に理にかなっていたので、定期的に操作を使用してそれらを取り出して入れます。
今日、人々が1 GBのRAMしか持っていないことであなたをm笑し、200 GB未満のハードドライブを見つけることができる唯一の場所は骨is品店です。
1ビットのブール値と4ビットおよび2ビットの整数を持つことができます。しかし、それはアーキテクチャを見るための不自然な方法であるため、パフォーマンスが向上しない奇妙な命令セットになります。実際には、その未使用データを回収しようとするのではなく、バイトのより良い部分を「無駄にする」のが理にかなっています。
私の経験では、いくつかのブール値を1バイトに詰め込むのが面倒な唯一のアプリはSql Serverです。
ビットフィールドを使用して、サブサイズの整数を取得できます。
struct X
{
int val:4; // 4 bit int.
};
通常は、構造をハードウェアの予想ビットパターンに正確にマッピングするために使用されます。
struct SomThing // 1 byte value (on a system where 8 bits is a byte
{
int p1:4; // 4 bit field
int p2:3; // 3 bit field
int p3:1; // 1 bit
};
バイトは言語の最小のアドレス可能な単位だからです。
しかし、例えば、それらがたくさんある場合、boolを1ビットにすることができます。次のような構造体で:
struct A
{
bool a:1, b:1, c:1, d:1, e:1;
};
一般に、CPUは基本単位として1バイトのメモリを割り当てますが、MIPSなどの一部のCPUは4バイトのWordを使用します。
ただし、vector
は特別な方法でbool
を処理し、vector<bool>
各ブールに1ビットが割り当てられます。
bool
は1バイト(CPUのアドレス可能な最小サイズ、またはそれ以上)にすることができます。パフォーマンスのためにbool
をint
のサイズにすることは珍しくありません。特定の目的(ハードウェアシミュレーションなど)でNビットの型が必要な場合は、そのためのライブラリを見つけることができます(例:GBLライブラリにはBitSet<N>
クラス)。 bool
(おそらく大きなコンテナを持っている)のサイズに関心がある場合は、自分でビットをパックするか、std::vector<bool>
それはあなたのためにそれを行います(後者はコンテナの要件を満たさないので注意してください)。
可能な最小サイズが1バイトの場合でも、1バイトに8ビットのブール情報を含めることができます。
http://en.wikipedia.org/wiki/Bit_array
たとえば、ジュリア言語にはBitArrayがあり、C++の実装について読みました。
エミュレータレベルでこれを実装する方法を考えてください...
bool a[10] = {false};
bool &rbool = a[3];
bool *pbool = a + 3;
assert(pbool == &rbool);
rbool = true;
assert(*pbool);
*pbool = false;
assert(!rbool);
CPUが1ビットCPUの場合、ブール値は1ビットになります。
一般に、CPUのビットサイズ(8ビット、16ビット、32ビットなど)は、CPUで操作できるデータの最小サイズの尺度です。したがって、これもアドレス空間のサイズです。 (ポインターとデータは多くのレベルで同じものであるため。).
バイトは、コンピューターのデジタルデータストレージの小さい単位です。コンピューターでは、RAMには数百万のバイトがあり、誰でもアドレスを持っています。すべてのビットにアドレスがある場合、コンピューターは管理できるものの8倍少ないRAMを管理できます。
詳細: ウィキペディア