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 glaubte ich, dies sei aus Leistungsgründen der Fall, aber was ist dann auf einem 32-Bit- oder 64-Bit-Computer, auf dem die Register 32 oder 64 Bit breit sind, der Leistungsvorteil?
Oder ist es nur einer dieser "historischen" Gründe?
sizeof(bool)
es 4 geben würde. Ich könnte schwören, dass msvc 32-Bit-Bools hat, aber ich habe es nur versucht und es nicht.vector<bool>
nicht darin, dass es versucht, klug zu sein und Bools in Stücke zu packen, sondern dass es versucht, dies zu tun und sich als STL-Container zu tarnen . Ein einfaches Bitset wäre in Ordnung gewesen, solange es nicht auch vorgibt, ein STL-Container zu sein.bool
Datentyp mit dem Windows-BOOL
Typ, auf den typisiert istlong
. Alsosizeof(bool) != sizeof(BOOL)
, was sicher viel Verwirrung stiftet (und wahrscheinlich eine ganze Reihe von Fehlern). Zumal es auchboolean
undBOOLEAN
typedefs in Windows gibt, die Aliase für sindunsigned char
. Beachten Sie außerdem, dassbool
der C ++ - Standard zwar 1 Byte enthält, der Hinweis jedoch ausdrücklich angibt,sizeof(bool)
dass er größer sein kann.Antworten:
Weil jeder C ++ - Datentyp adressierbar sein muss.
Wie würden Sie einen Zeiger auf ein einzelnes Bit erstellen? Das kannst du nicht. Sie können jedoch einen Zeiger auf ein Byte erstellen. Ein Boolescher Wert in C ++ hat also normalerweise die Größe von Bytes. (Es kann auch größer sein. Das hängt von der Implementierung ab. Hauptsache, es muss adressierbar sein, damit kein C ++ - Datentyp kleiner als ein Byte sein kann.)
quelle
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.
quelle
Ein
boolean
Typ folgt normalerweise der kleinsten Einheit des adressierbaren Speichers des Zielcomputers (dh normalerweise dem 8-Bit-Byte).Der Zugriff auf den Speicher erfolgt immer in "Blöcken" (mehrere Wörter, dies dient der 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 häufig spezielle Anweisungen, um Bits unabhängig voneinander zu manipulieren.
Aus diesem Grund ist es durchaus üblich, Techniken des "Bitpackens" zu verwenden, um die Effizienz bei der Verwendung von "booleschen" Basisdatentypen zu erhöhen. Eine Technik wie
enum
(in C) mit einer Potenz von 2 Codierung ist ein gutes Beispiel. Die gleiche Art von Trick findet man in den meisten Sprachen.Aktualisiert : Dank einer hervorragenden Diskussion wurde ich darauf aufmerksam gemacht, dass
sizeof(char)==1
per Definition in C ++. Daher ist die Adressierung eines "booleschen" Datentyps ziemlich an die kleinste Einheit des adressierbaren Speichers gebunden (was meinen Standpunkt verstärkt).quelle
bool
Typ folgt der kleinsten Einheit des zuweisbaren Speichers, da C ++ erfordert, dass es möglich sein muss, Zeiger darauf zu erstellen . Ohne diese Anforderungbool
hätte a möglicherweise auch auf aktuellen byteadressierbaren Maschinen als ein einziges Bit dargestellt werden können.sizeof(char)==1 definition
das ist das beste Gegenargument zu meiner Argumentation. Vielen Dank!Die Antworten, dass 8-Bit die kleinste speicherbare Speichermenge ist, sind korrekt. Einige Sprachen können jedoch in gewisser Weise 1-Bit für Boolesche Werte verwenden. Ich erinnere mich an Pascals Implementierung von Sets als Bitstrings. Das heißt, für den folgenden Satz:
Sie könnten dies im Speicher haben:
Sie können in C / C ++ natürlich etwas Ähnliches tun, wenn Sie möchten. (Wenn Sie eine Reihe von Booleschen Werten im Auge behalten, könnte dies sinnvoll sein, aber es hängt wirklich von der Situation ab.)
quelle
vector
. Es handelt sich eigentlich nicht um einen STL-Container, da das Verhalten Einschränkungen unterliegt. Schlimmer ist, dass es Probleme mit jemandem verursacht, derbool
s hat und einen daraus machenvector
will. Es ist ein überraschendes Verhalten, und das ist nicht das, was Sie in einer Sprache wollen.Ich weiß, dass das alt ist, 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 das Risiko eines Speicherausfalls. Wie gehen Sie mit Fehlerstatistiken im nur ein Bit langen Speicher um?
Ich ging zu einem Vorstellungsgespräch und eine der Aussagen des Programmleiters lautete: "Wenn wir das Signal zum Starten einer Rakete senden, senden wir einfach ein einfaches Ein-Bit-Ein-Aus-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ösen, eine 1-Bit-Nachricht zu versenden. Oder was passiert, wenn das Bit während der Übertragung in die andere Richtung gedreht wird?
quelle
bool
8 Bits auf dem OP-Computer und 32 auf meinem verwendet werden, da diese anderen 7 oder 31 Bits sicherlich nicht für "Fehlerstatistiken" verwendet werden. Das macht keinen SinnEinige eingebettete Compiler haben einen int1-Typ, der zum Bitpacken von booleschen Flags verwendet wird (z. B. CC-Serie von C-Compilern für Microchip-MPUs). Das Setzen, Löschen und Testen dieser Variablen verwendet Befehle auf Bitebene mit einem Befehl, aber der Compiler lässt aus den in anderen Antworten angegebenen Gründen keine anderen Operationen zu (z. B. die Adresse der Variablen zu übernehmen).
quelle