web-dev-qa-db-ja.com

ブール値が1バイトではなく1バイトであるのはなぜですか?

C++では、

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

CPUのエミュレーターを作成するとき、上記のことを見逃しています

114
Asm

CPUは1バイトより小さいものには対応できないためです。

180
Paul Tomblin

From Wikipedia

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

したがって、バイトはthe基本的なアドレス可能ユニットであり、これより下ではコンピュータアーキテクチャはアドレス指定できません。また、(おそらく)4ビットバイトをサポートするコンピューターは存在しないため、4-bitboolはありません。等.

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

27
Nawaz

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

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

12
sukru

昔、猛烈なブリザードで学校まで歩いて両方の道を登らなければならなかったとき、昼食は学校の後ろの森で追跡して素手で殺すことができる動物でしたが、コンピュータは今日。私が使用した最初のコンピューターには6KのRAMがありました。 6メガバイトでも、6ギガバイトでも、6キロバイトでもありません。その環境では、できるだけ多くのブール値をintにパックすることは非常に理にかなっていたので、定期的に操作を使用してそれらを取り出して入れます。

今日、人々が1 GBのRAMしか持っていないことであなたをm笑し、200 GB未満のハードドライブを見つけることができる唯一の場所は骨is品店です。

8
Jay

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

私の経験では、いくつかのブール値を1バイトに詰め込むのが面倒な唯一のアプリはSql Serverです。

6
Paul Sasik

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

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
};
5
Martin York

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

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

struct A
{
  bool a:1, b:1, c:1, d:1, e:1;
};
4
bratao

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

ただし、vectorは特別な方法でboolを処理し、vector<bool>各ブールに1ビットが割り当てられます。

1
Ryan Li

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

1
Gene Bushuyev

可能な最小サイズが1バイトの場合でも、1バイトに8ビットのブール情報を含めることができます。

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

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

1

エミュレータレベルでこれを実装する方法を考えてください...

bool a[10] = {false};

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

assert(pbool == &rbool);
rbool = true;
assert(*pbool);
*pbool = false;
assert(!rbool);
0
franji1

CPUが1ビットCPUの場合、ブール値は1ビットになります。

一般に、CPUのビットサイズ(8ビット、16ビット、32ビットなど)は、CPUで操作できるデータの最小サイズの尺度です。したがって、これもアドレス空間のサイズです。 (ポインターとデータは多くのレベルで同じものであるため。).

0
Hogan

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

詳細: ウィキペディア

0
Francesco Pasa