Antworten:
Weil die CPU nichts kleiner als ein Byte adressieren kann.
bt
, bts
, btr
und btc
können einzelne Bits adressieren!
bt
adressiert einen Byte-Offset und testet dann das Bit an einem bestimmten Offset, unabhängig davon, ob Sie eine Adresse in Bytes angeben ... Bit-Offset-Literale würden etwas wortreich werden (entschuldigen Sie das Wortspiel).
Aus Wikipedia :
In der Vergangenheit war ein Byte die Anzahl der Bits, die zum Codieren eines einzelnen Textzeichens in einem Computer verwendet wurden, und ist aus diesem Grund das grundlegende adressierbare Element in vielen Computerarchitekturen.
Byte ist also die grundlegende adressierbare Einheit , unterhalb derer die Computerarchitektur nicht adressieren kann. Und da es (wahrscheinlich) keine Computer gibt, die 4-Bit-Byte unterstützen, haben Sie kein 4-Bit bool
usw.
Wenn Sie jedoch eine solche Architektur entwerfen können, die 4-Bit als adressierbare Grundeinheit adressieren kann, haben Sie bool
dann nur auf diesem Computer die Größe 4-Bit!
int
und char
von meinem Beitrag.
bool
, da dies die char
kleinste adressierbare Einheit in C ++ ist , unabhängig davon, was die Architektur mit ihren eigenen Opcodes adressieren kann. sizeof(bool)
muss einen Wert von mindestens 1 haben und benachbarte bool
Objekte müssen ihre eigenen Adressen in C ++ haben , so dass die Implementierung sie nur größer machen und Speicher verschwenden muss. Aus diesem Grund gibt es als Sonderfall Bitfelder: Die Bitfeldelemente einer Struktur müssen nicht separat adressierbar sein, daher können sie kleiner als a sein char
(obwohl die gesamte Struktur immer noch nicht sein kann).
char
es sich um die kleinste adressierbare Einheit in C ++ handelt?
sizeof(bool)
kann nicht 0,5 sein :-) Ich nehme an, eine Implementierung könnte legal Sub-Byte-Zeiger als Erweiterung bereitstellen, aber "gewöhnliche" Objekte wie bool, die auf gewöhnliche Weise zugewiesen werden, müssen das tun, was der Standard sagt.
Die einfachste Antwort ist; Dies liegt daran, dass die CPU den Speicher in Bytes und nicht in Bits adressiert und die bitweisen Operationen sehr langsam sind.
Es ist jedoch möglich, die Bitgrößenzuweisung in C ++ zu verwenden. Es gibt eine std :: vector-Spezialisierung für Bitvektoren und auch Strukturen, die Einträge in Bitgröße verwenden.
Früher, als ich in einem wütenden Schneesturm bergauf zur Schule gehen musste und das Mittagessen das Tier war, das wir im Wald hinter der Schule ausfindig machen und mit bloßen Händen töten konnten, hatten Computer viel weniger Speicher zur Verfügung als heute. Der erste Computer, den ich jemals benutzt habe, hatte 6 KB RAM. Nicht 6 Megabyte, nicht 6 Gigabyte, 6 Kilobyte. In dieser Umgebung war es sehr sinnvoll, so viele Boolesche Werte wie möglich in ein int zu packen. Daher verwendeten wir regelmäßig Operationen, um sie herauszunehmen und einzufügen.
Wenn Sie heute verspottet werden, nur 1 GB RAM zu haben, und der einzige Ort, an dem Sie eine Festplatte mit weniger als 200 GB finden könnten, ein Antiquitätengeschäft ist, lohnt es sich einfach nicht, Bits zu packen.
Sie könnten 1-Bit-Bools und 4- und 2-Bit-Ints haben. Dies würde jedoch zu einem seltsamen Befehlssatz ohne Leistungsgewinn führen, da dies eine unnatürliche Art ist, die Architektur zu betrachten. Es ist tatsächlich sinnvoll, einen größeren Teil eines Bytes zu "verschwenden", anstatt zu versuchen, diese nicht verwendeten Daten zurückzugewinnen.
Die einzige App, die meiner Erfahrung nach mehrere Bools in ein einziges Byte packt, ist SQL Server.
Sie können Bitfelder verwenden, um Ganzzahlen mit Untergröße abzurufen.
struct X
{
int val:4; // 4 bit int.
};
Obwohl es normalerweise verwendet wird, um Strukturen exakten Hardware-erwarteten Bitmustern zuzuordnen:
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
};
bool
kann ein Byte sein - die kleinste adressierbare Größe der CPU oder kann größer sein. Es ist nicht ungewöhnlich, dass Sie für Leistungszwecke bool
die Größe haben müssen int
. Wenn Sie für bestimmte Zwecke (z. B. Hardware-Simulation) einen Typ mit N Bits benötigen, können Sie eine Bibliothek dafür finden (z. B. hat die GBL-Bibliothek eine BitSet<N>
Klasse). Wenn Sie sich mit der Größe von befassen bool
(Sie haben wahrscheinlich einen großen Behälter), können Sie Bits selbst verpacken oder verwenden std::vector<bool>
, um dies für Sie zu tun (seien Sie vorsichtig mit letzterem, da es die Behälteranforderungen nicht erfüllt).
Da die CPU im Allgemeinen Speicher mit 1 Byte als Basiseinheit zuweist, verwenden einige CPUs wie MIPS ein 4-Byte-Wort.
Allerdings vector
befasst sich bool
in einer besonderen Art und Weise, mit vector<bool>
einem Bit für jeden Bool zugeordnet ist.
lw
/ sw
viel häufiger verwendet.
Das Byte ist die kleinere Einheit der digitalen Datenspeicherung eines Computers. In einem Computer hat der RAM Millionen von Bytes und jeder von ihnen hat eine Adresse. Wenn es eine Adresse für jedes Bit geben würde, könnte ein Computer 8 Mal weniger RAM verwalten als er kann.
Weitere Infos: Wikipedia
Selbst wenn die minimal mögliche Größe 1 Byte beträgt, können Sie 8 Boolesche Bits an 1 Byte haben:
http://en.wikipedia.org/wiki/Bit_array
Die Julia-Sprache hat zum Beispiel BitArray und ich habe über C ++ - Implementierungen gelesen.
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
. Die meisten Compiler weisen eine vollständige Zuweisung zuunsigned int
, sie kümmern sich jedoch selbst um das Bit-Twiddling, wenn Sie lesen / schreiben. Sie beschäftigen sich auch selbst mit den Modulo-Operationen. Das ist einunsigned small : 4
Attribut hat einen Wert zwischen 0 und 15, und wenn es auf 16 kommen sollte, wird das vorhergehende Bit nicht überschrieben :)