Frage

Ich lese Die C ++ Programmiersprache. Darin heißt es, dass Stroustrup sizeof(char) == 1 und 1 <= sizeof(bool). Die Besonderheiten sind abhängig von der Implementierung. Warum sollte so ein einfacher Wert als boolean nehmen den gleichen Raum wie ein char?

War es hilfreich?

Lösung

In der modernen Computerarchitekturen, ein Byte ist die kleinste adressierbare Einheit des Speichers. Um mehrere Bits in einem Byte-Pack erfordert zusätzliche Bit-Schicht-Betrieb anwenden. Auf der Compiler-Ebene, es ist ein Trade-off von Speichern vs. Geschwindigkeitsanforderungen (und in High-Performance-Software, diese zusätzlichen Bit-Verschiebeoperationen aufsummieren und die Anwendung verlangsamen unnötig).

Andere Tipps

Da in C ++ Sie die Adresse eines boolean nehmen können und die meisten Maschinen können nicht einzelne Bits adressieren.

Es nimmt den gleichen Raum, da die kleinste Menge an Speicherplatz Sie in den Speicher schreiben kann ein einziges Byte ist. Beide Werte werden in einem Byte gespeichert. Obwohl Sie theoretisch nur 1 Bit benötigt einen Booleschen Wert, um anzuzeigen, Sie immer noch ein ganzes Byte speichern den Wert müssen.

Theoretisch braucht man nur ein einzelnes Bit für eine Bool, aber die Arbeit mit weniger als 1 Byte im Wert von Daten ist etwas chaotisch. Sie brauchen mehr Anweisungen, etwas zu erreichen und bietet Ihnen nicht wirklich.

Wenn Sie mehrere Boolesche Werte in ein einziges Byte packen wollen, dass Sie Bit-Feldstruktur verwenden .

Eigentlich in den meisten Implementierung, die ich von sizeof (Bool) weiß == sizeof (int). „Int“ soll die Datengröße sein, die am effizientesten ist für die CPU zu arbeiten. Daher Dinge, die sind nicht eine bestimmte Größe (wie „char“) haben die gleiche Größe wie ein int. Wenn Sie eine große Anzahl von ihnen pro Objekt haben, mögen Sie vielleicht ein Mittel zur Durchführung von ihnen für die Lagerung Verpackung, aber während der normalen Berechnung, sollte es bleiben, es ist nativer Größe.

Es ist dieses Ding in C ++ genannt Vektor, der die Tatsache auszunutzen versucht, dass man theoretisch 8 bools in einem char speichern kann, aber es ist weithin als ein Fehler von der C ++ Normenausschuss betrachtet. Das Buch „effektive stl“, sagt tatsächlich „verwenden Sie es nicht“. Das sollten Sie eine Vorstellung davon, wie schwierig es ist.

BTW: Knuth hat einen Buch rel="nofollow nur gewidmet bitweise Operationen. Boost hat auch eine Bibliothek Umgang mit großen Zahlen gewidmet von Bits in einem Speicher effizient.

Ein Byte ist die kleinste adressierbare Einheit des Speichers.

Betrachten Sie den folgenden Code ein:

    bool b[9];
    bool *pb0 = &b[0];
    bool *pb1 = &b[1];

    for (int counter=0; counter<9; ++counter)
    {
         // some code here to fill b with values
         b[counter] = true;

    }

Wenn bool als 1 Bit gespeichert wird, dann wird pb0 PB1 gleich, weil beide die gleiche Adresse haben. Dies ist eindeutig nicht wünschenswert!

Zusätzlich wird die Zuordnung in der Schleife in nicht-triviale Assembler-Code führen. Es wird eine andere Bitverschiebung in jeder Iteration der Schleife umfassen. In der High-Performance-Software, können diese zusätzlichen Bit-Shift-Operationen unnötig die Anwendung verlangsamen.

Die STL-Bibliothek stellt eine Behelfslösung in Situationen, in denen Raum ist egal. Die Verwendung von std :: vector speichert bool als 1 Bit. Das Paradox des obigen Beispiel gelten nicht, weil

  • die Überlastung des Operators [] blendet die Unbilden des Bitverschiebeoperation
  • die Verwendung von Iteratoren anstelle von Zeigern gibt zusätzliche Flexibilität bei der Umsetzung
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top