179

C++ では、

  • ブール値が 1 ビットではなく 1 バイトであるのはなぜですか?
  • 4 ビットや 2 ビットの整数のような型がないのはなぜですか?

CPU用のエミュレータを書くときに上記のことを見逃しています

4

13 に答える 13

273

CPU は 1 バイトより小さいアドレスを指定できないためです。

于 2011-01-07T15:03:42.807 に答える
50

ウィキペディアから:

歴史的に、バイトはコンピュータでテキストの1文字をエンコードするために使用されるビット数であり、このため、多くのコンピュータアーキテクチャでアドレス指定可能な基本要素です。

したがって、バイトは基本 的なアドレス指定可能な単位であり、それを下回るとコンピュータアーキテクチャはアドレス指定できません。そして、(おそらく)4ビットバイトをサポートするコンピュータは存在しないので、 4ビット boolなどはありません。

ただし、基本的なアドレス指定可能なユニットとして4ビットをアドレス指定できるアーキテクチャを設計できる場合はbool、そのコンピュータでのみ4ビットのサイズになります。

于 2011-01-07T15:18:38.760 に答える
19

昔は猛吹雪の中、登校しなければならず、昼食は学校の裏の森で見つけて素手で殺すことができる動物でした.今日。私が初めて使ったコンピュータには 6K の RAM が搭載されていました。6メガバイトじゃない、6ギガバイトじゃない、6キロバイト。その環境では、可能な限り多くのブール値を int にパックすることが非常に理にかなっており、定期的に操作を使用してそれらを取り出したり入れたりしていました。

今日では、RAM が 1 GB しかないことを嘲笑され、200 GB 未満のハード ドライブを見つけることができる唯一の場所がアンティーク ショップである場合、ビットを詰め込むのに苦労するだけの価値はありません。

于 2011-01-07T17:36:07.493 に答える
17

最も簡単な答えは次のとおりです。これは、CPU がメモリをビット単位ではなくバイト単位でアドレス指定し、ビット単位の操作が非常に遅いためです。

ただし、C++ ではビットサイズの割り当てを使用できます。ビットベクトル用の std::vector 特殊化と、ビットサイズのエントリを取る構造体もあります。

于 2011-01-07T15:04:42.147 に答える
12

バイトは、言語でアドレス可能な最小単位だからです。

しかし、たとえば bool がたくさんある場合は、1 ビットかかるようにすることができます。次のように、構造体で:

struct A
{
  bool a:1, b:1, c:1, d:1, e:1;
};
于 2011-01-07T15:05:33.990 に答える
11

1 ビットの bool と 4 ビットおよび 2 ビットの int を使用できます。しかし、それはアーキテクチャを見る上で不自然な方法であるため、パフォーマンスが向上しない奇妙な命令セットになります。実際には、未使用のデータを再利用しようとするのではなく、バイトのより良い部分を「無駄にする」ことが理にかなっています。

私の経験では、複数の bool を 1 バイトにまとめようとするアプリは Sql Server だけです。

于 2011-01-07T15:05:08.213 に答える
9

ビットフィールドを使用して、サブサイズの整数を取得できます。

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
};
于 2011-01-07T15:15:24.703 に答える
6

bool1 バイト (CPU のアドレス指定可能な最小サイズ) にすることも、それより大きくすることもできます。パフォーマンスのためboolに のサイズにする必要があるのは珍しいことではありません。int特定の目的 (ハードウェア シミュレーションなど) で N ビットの型が必要な場合は、そのためのライブラリを見つけることができます (たとえば、GBL ライブラリにはBitSet<N>クラスがあります)。のサイズに関心がある場合bool(おそらく大きなコンテナーを使用している場合)、ビットを自分でパックするか、それを使用std::vector<bool>してください (コンテナーの要件を満たさないため、後者には注意してください)。

于 2011-01-07T16:01:28.823 に答える
3

エミュレータレベルでこれをどのように実装するかを考えてください...

bool a[10] = {false};

bool &rbool = a[3];
bool *pbool = a + 3;

assert(pbool == &rbool);
rbool = true;
assert(*pbool);
*pbool = false;
assert(!rbool);
于 2011-01-07T21:18:20.120 に答える
3

一般に、CPU は 1 バイトを基本単位としてメモリを割り当てますが、MIPS などの一部の CPU は 4 バイト ワードを使用します。

ただし、 bool ごとに 1 ビットが割り当てられるという特別な方法でvector処理されます。boolvector<bool>

于 2011-01-07T15:06:21.853 に答える
0

可能な最小サイズが 1 バイトであっても、1 バイトで 8 ビットのブール情報を持つことができます。

http://en.wikipedia.org/wiki/Bit_array

たとえば Julia 言語には BitArray があり、C++ の実装について読みました。

于 2013-01-24T14:16:58.787 に答える
0

バイトは、コンピューターのデジタル データ ストレージのより小さい単位です。コンピューターでは、RAM には数百万バイトがあり、それらのいずれかがアドレスを持っています。すべてのビットにアドレスがある場合、コンピューターはそれが管理できる RAM の 8 倍少ない RAM を管理できます。

詳細:ウィキペディア

于 2011-01-07T15:09:24.600 に答える