Warum wird ein Boolescher Wert als Byte in einem Computer gespeichert, wenn nur ein Bit benötigt wird?

32

Ich habe kürzlich angefangen, das Schreiben von Code zu lernen, und in meinem Buch bin ich auf diese Frage gestoßen. "Warum wird ein Boolescher Wert als Byte in einem Computer gespeichert, wenn er nur ein Bit benötigt?" Kann jemand mehr Licht in diese Frage bringen?

Herr 1.0
quelle
10
Dies ist streng genommen nicht wahr. Einige Sprachen (wie C / C ++) bieten Möglichkeiten zum Speichern von Booleschen Werten als einzelne Bits, wenn diese Bits in einem einzelnen Byte gebündelt sind. Mit anderen Worten, in C können Sie acht Boolesche Werte in einem Byte speichern. Dies wird jedoch nur von wenigen verwendet, da der Speicher billig ist und Prozessoren Daten in 8/16/32/64-Bit-Blöcken bearbeiten.
Gort the Robot
Diese Antwort auf eine ähnliche Frage sollten Sie sehen! Sie werden dort eine große Referenz bekommen ... Prost!
Sam

Antworten:

49

Es hat damit zu tun, was die CPU problemlos ansprechen kann. Beispielsweise gibt es auf einem x86-Prozessor ein eax(32 Bit), ein ax(16 Bit) und ein ah(8 Bit), jedoch kein Einzelbitregister. Damit ein einzelnes Bit verwendet werden kann, muss die CPU einen Lese- / Änderungs- / Schreibvorgang ausführen, um den Wert zu ändern. Wenn es als Byte gespeichert ist, kann ein einzelnes Lesen oder Schreiben verwendet werden, um den Wert zu prüfen / zu ändern.

Außerdem könnte man sich fragen, ob es besser wäre, ein einzelnes Bit anstelle eines vollständigen Bytes zu verwenden, schließlich würde ein Byte 7 Bits verschwenden. Sofern der Speicherplatz keine Einschränkung darstellt, sollte das Byte verwendet werden, da es, zumindest beim x86 und meiner Meinung nach bei anderen, normalerweise Anweisungen zum schnellen Setzen / Löschen eines Bools gibt, die viel schneller sind als das Lesen / Ändern / Schreiben eines einzelnen Bits . Aus persönlichen Messungen habe ich gesehen, dass die Lese / Mod / Schreib-Methode 5x langsamer ist als die Einzelanweisungsmethode.

barrem23
quelle
6
Das einzige Wort, das Sie vermissen, ist "Boundary Alignment".
Manoj R
3
Andererseits habe ich eine zweifache Beschleunigung durch die Verwendung einzelner Bits gesehen, vermutlich aufgrund einer besseren Cache-Nutzung mit einem kleineren Datensatz.
Michael Borgwardt
5

Wie @ barrem23 erklärt , müssen die Daten adressierbar sein und die kleinste Grenze für herkömmliche Architekturen ist ein Byte.

Aber da diese Frage markiert ist , kann es sich lohnen zeigen sollte, dass std::vector<bool>sich spezialisiert , damit einzelne Elemente als Bits gespeichert werden . Dies spart Platz, da einige Funktionen verloren gehen (die beispielsweise std::searchmöglicherweise nicht funktionieren).

Chrisaycock
quelle