it-swarm.com.de

C ++: Warum ist Bool 8 Bit lang?

In C++ frage ich mich, warum der Bool-Typ 8 Bit lang ist (auf meinem System), wobei nur ein Bit ausreicht, um den Booleschen Wert zu speichern.

Früher habe ich geglaubt, dass dies aus Gründen der Leistung geschah, aber auf einer 32-Bit- oder 64-Bit-Maschine, auf der die Register 32 oder 64 Bit breit sind, was ist der Leistungsvorteil?

Oder ist es nur einer dieser "historischen" Gründe?

125
Jérôme

Weil jeder C++ - Datentyp adressierbar sein muss.

Wie würden Sie einen Zeiger auf ein einzelnes Bit erstellen? Das kannst du nicht. Aber Sie können einen Zeiger auf ein Byte erstellen. Ein Boolescher Wert in C++ ist normalerweise bytegross. (Es kann auch größer sein. Dies hängt von der Implementierung ab. Hauptsache, es muss adressierbar sein, damit kein C++ - Datentyp kleiner als ein Byte sein kann.)

214
jalf

Der Speicher ist byteadressierbar. Sie können kein einzelnes Bit adressieren, ohne das aus dem Speicher gelesene Byte zu verschieben oder zu maskieren. Ich würde mir vorstellen, dass dies ein sehr großer Grund ist.

38

Ein boolean -Typ ist normalerweise folgt der kleinsten adressierbaren Speichereinheit des Zielcomputers (d. H. Normalerweise das 8-Bit-Byte).

Der Speicherzugriff erfolgt immer in "Blöcken" (mehrere Wörter, dies gilt für Effizienz auf Hardwareebene, Bustransaktionen): Ein Boolesches Bit kann in den meisten CPU-Systemen nicht "allein" adressiert werden. Sobald die Daten in einem Register enthalten sind, gibt es natürlich oft spezielle Anweisungen, um Bits unabhängig zu manipulieren.

Aus diesem Grund ist es üblich, Techniken des "Bitpackens" zu verwenden, um die Effizienz bei der Verwendung von "booleschen" Basisdatentypen zu erhöhen. Ein gutes Beispiel ist eine Technik wie enum (in C) mit der Potenz 2. Dieselbe Art von Trick findet man in den meisten Sprachen.

pdated: Dank einer hervorragenden Diskussion wurde ich darauf aufmerksam gemacht, dass sizeof(char)==1 durch definition in C++. Daher ist die Adressierung eines "booleschen" Datentyps ziemlich eng mit der kleinsten Einheit des adressierbaren Speichers verknüpft (unterstreicht meinen Standpunkt).

18
jldupont

Die Antworten, dass 8-Bit die kleinste adressierbare Speichermenge ist, sind korrekt. Einige Sprachen können jedoch in gewisser Weise 1-Bit für Boolesche Werte verwenden. Ich scheine mich zu erinnern, wie Pascal Sets als Bitstrings implementiert hat. Das heißt für den folgenden Satz:

{1, 2, 5, 7}

Möglicherweise haben Sie Folgendes im Gedächtnis:

01100101

Sie können natürlich in C/C++ etwas Ähnliches tun, wenn Sie möchten. (Wenn Sie eine Reihe von Booleschen Werten im Auge behalten, ist es könnte sinnvoll, aber es hängt wirklich von der Situation ab.)

6
Benjamin Oakes

Ich weiß, das ist alt, aber ich dachte, ich würde meine 2 Cent einwerfen.

Wenn Sie Ihren Booleschen Wert oder Datentyp auf ein Bit beschränken, besteht für Ihre Anwendung die Gefahr einer Speicherbeschädigung. Wie gehen Sie mit Fehlerstatistiken im nur ein Bit langen Speicher um?

Ich ging zu einem Vorstellungsgespräch und einer der Aussagen des Programmleiters lautete: "Wenn wir das Signal senden, um eine Rakete zu starten, senden wir einfach ein Bit für Bit über Funk. Das Senden eines Bits ist extrem schnell und wir brauche dieses Signal, um so schnell wie möglich zu sein. "

Nun, es war ein Test, um zu sehen, ob ich die Konzepte und Bits, Bytes und die Fehlerbehandlung verstanden habe. Wie einfach wäre es für einen Bösewicht, eine Ein-Bit-Nachricht zu verschicken. Oder was passiert, wenn während der Übertragung das Bit in die andere Richtung gedreht wird.

1
Cire

Einige eingebettete Compiler haben einen int1-Typ, der zum Bit-Packen von Booleschen Flags verwendet wird (z. B. CCS-Reihe von C-Compilern für Microchip-MPUs). Das Setzen, Löschen und Testen dieser Variablen verwendet Befehle auf Einzelbefehlsbitebene, der Compiler lässt jedoch aus den in anderen Antworten angegebenen Gründen keine anderen Operationen zu (z. B. das Abrufen der Adresse der Variablen).

1
EBlake