C++ では、
- ブール値が 1 ビットではなく 1 バイトであるのはなぜですか?
- 4 ビットや 2 ビットの整数のような型がないのはなぜですか?
CPU用のエミュレータを書くときに上記のことを見逃しています
C++ では、
CPU用のエミュレータを書くときに上記のことを見逃しています
CPU は 1 バイトより小さいアドレスを指定できないためです。
ウィキペディアから:
歴史的に、バイトはコンピュータでテキストの1文字をエンコードするために使用されるビット数であり、このため、多くのコンピュータアーキテクチャでアドレス指定可能な基本要素です。
したがって、バイトは基本 的なアドレス指定可能な単位であり、それを下回るとコンピュータアーキテクチャはアドレス指定できません。そして、(おそらく)4ビットバイトをサポートするコンピュータは存在しないので、 4ビット bool
などはありません。
ただし、基本的なアドレス指定可能なユニットとして4ビットをアドレス指定できるアーキテクチャを設計できる場合はbool
、そのコンピュータでのみ4ビットのサイズになります。
昔は猛吹雪の中、登校しなければならず、昼食は学校の裏の森で見つけて素手で殺すことができる動物でした.今日。私が初めて使ったコンピュータには 6K の RAM が搭載されていました。6メガバイトじゃない、6ギガバイトじゃない、6キロバイト。その環境では、可能な限り多くのブール値を int にパックすることが非常に理にかなっており、定期的に操作を使用してそれらを取り出したり入れたりしていました。
今日では、RAM が 1 GB しかないことを嘲笑され、200 GB 未満のハード ドライブを見つけることができる唯一の場所がアンティーク ショップである場合、ビットを詰め込むのに苦労するだけの価値はありません。
最も簡単な答えは次のとおりです。これは、CPU がメモリをビット単位ではなくバイト単位でアドレス指定し、ビット単位の操作が非常に遅いためです。
ただし、C++ ではビットサイズの割り当てを使用できます。ビットベクトル用の std::vector 特殊化と、ビットサイズのエントリを取る構造体もあります。
バイトは、言語でアドレス可能な最小単位だからです。
しかし、たとえば bool がたくさんある場合は、1 ビットかかるようにすることができます。次のように、構造体で:
struct A
{
bool a:1, b:1, c:1, d:1, e:1;
};
1 ビットの bool と 4 ビットおよび 2 ビットの int を使用できます。しかし、それはアーキテクチャを見る上で不自然な方法であるため、パフォーマンスが向上しない奇妙な命令セットになります。実際には、未使用のデータを再利用しようとするのではなく、バイトのより良い部分を「無駄にする」ことが理にかなっています。
私の経験では、複数の bool を 1 バイトにまとめようとするアプリは Sql Server だけです。
ビットフィールドを使用して、サブサイズの整数を取得できます。
struct X
{
int val:4; // 4 bit int.
};
通常は、構造体を正確なハードウェアの予期されるビット パターンにマップするために使用されますが、次のようになります。
// 1 byte value (on a system where 8 bits is a byte)
struct SomThing
{
int p1:4; // 4 bit field
int p2:3; // 3 bit field
int p3:1; // 1 bit
};
bool
1 バイト (CPU のアドレス指定可能な最小サイズ) にすることも、それより大きくすることもできます。パフォーマンスのためbool
に のサイズにする必要があるのは珍しいことではありません。int
特定の目的 (ハードウェア シミュレーションなど) で N ビットの型が必要な場合は、そのためのライブラリを見つけることができます (たとえば、GBL ライブラリにはBitSet<N>
クラスがあります)。のサイズに関心がある場合bool
(おそらく大きなコンテナーを使用している場合)、ビットを自分でパックするか、それを使用std::vector<bool>
してください (コンテナーの要件を満たさないため、後者には注意してください)。
エミュレータレベルでこれをどのように実装するかを考えてください...
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 バイトを基本単位としてメモリを割り当てますが、MIPS などの一部の CPU は 4 バイト ワードを使用します。
ただし、 bool ごとに 1 ビットが割り当てられるという特別な方法でvector
処理されます。bool
vector<bool>
可能な最小サイズが 1 バイトであっても、1 バイトで 8 ビットのブール情報を持つことができます。
http://en.wikipedia.org/wiki/Bit_array
たとえば Julia 言語には BitArray があり、C++ の実装について読みました。
バイトは、コンピューターのデジタル データ ストレージのより小さい単位です。コンピューターでは、RAM には数百万バイトがあり、それらのいずれかがアドレスを持っています。すべてのビットにアドレスがある場合、コンピューターはそれが管理できる RAM の 8 倍少ない RAM を管理できます。
詳細:ウィキペディア