Warum ist die Größe von "std :: vectorbool" 16 Byte?

8

Ich verwende memcpy, um den Inhalt von std zu kopieren: vectors & lt; & gt; Primzahlen Arrays. Für Datentypen wie int, float, double usw. hat es gut funktioniert. Als ich anfing, einen boolvector zu kopieren, stieß ich auf ein Problem, nämlich seltsame Werte.

Zuerst habe ich eine Testausgabe für einen Float-Vektor gemacht:

%Vor%

Die Ausgabe ist:

%Vor%

Und das ist, was ich erwarte. Die Float-Größe beträgt 4 Byte und die Entfernung zum nächsten Float-Wert beträgt 4 Byte. Wenn ich das für bool mache, sieht die Ausgabe so aus:

%Vor%

Die Ausgabe ist:

%Vor%

Warum ist die Größe von bool 16 Byte? Es scheint mir total übertrieben zu sein. Gibt es dafür Erklärungen?

    
akristmann 04.04.2013, 10:53
quelle

2 Antworten

18

Im Gegensatz zu anderen Spezialisierungen von vector verwaltet vector<bool> kein dynamisches Array von bool -Objekten. Stattdessen soll es die booleschen Werte in jeweils ein einzelnes Bit packen.

Da einzelne Bits nicht adressierbar sind, kann test[0] nicht einfach eine Referenz auf bool sein. Stattdessen ist es ein Klassentyp vector<bool>::reference , der in bool konvertiert werden kann (um den Wert zu erhalten) und von bool zugewiesen wird (um das Vektorelement zu ändern).

Dies bedeutet, dass vector<bool> die Anforderungen eines Standardcontainers nicht vollständig erfüllt und nicht verwendet werden kann, wenn Sie Verweise oder Zeiger auf seine Elemente benötigen. Wenn Sie einen "echten" Container mit adressierbaren Elementen benötigen, berücksichtigen Sie stattdessen vector<char> oder deque<bool> .

    
Mike Seymour 04.04.2013, 11:01
quelle
4

std::vector<bool> ist eine spezialisierte Vektorversion, die für den Speicherplatz optimiert ist.

  • Der Speicher ist nicht notwendigerweise ein Array von bool-Werten, aber die Bibliotheksimplementierung kann den Speicher optimieren, sodass jeder Wert in einem einzigen Bit gespeichert wird.
  • Elemente werden nicht mit dem Zuweisungsobjekt konstruiert, sondern ihr Wert wird direkt auf das richtige Bit im internen Speicher gesetzt.

Weitere Informationen: Ссылка

    
nmikhailov 04.04.2013 10:58
quelle

Tags und Links