Spezialisierungen sparen Platz

Die Standardbibliothek verwendet Template-Spezialisierungen, um verschiedene Probleme zu lösen. Unter anderem Platzprobleme, wie man an der Spezialisierung für std::vector<bool> sehen kann.

Video

Erklärung

Heute mal ohne Quelltext. Der wäre eh kaum länger, als drei Zeilen. Der Bedarf für eine Spezialisierung von std::vector<bool> hat einen einfachen Hintergrund: std::vector in seiner allgemeinen Form repräsentiert ein Array von Elementen, die im Speicher hintereinander liegen. Damit sie hintereinander liegen können, müssen wie addressierbar sein. Um wiederum addressierbar zu sein, müssen sie eine Größe haben, die mindestens der kleinsten addressierbaren Einheit entspricht, dem char. Dummerweise ist der mindestens 8 Bit groß. Wir verschwenden also 8 Bit, um eine Information zu speichern, die in einem Bit Platz hat und blasen damit den Speicherbedarf eines std::vector<bool> unnötig auf. Aus diesem Grund greift der Standard ein und definiert für diesen speziellen Fall einige Ausnahmen, die es erlauben, mehrere Bits in ein Byte zu packen. Wie die Realisierung intern genau aussieht, ist Sache der Implementierung. Bei den meisten kann man guten Gewissens davon ausgehen, dass jedes bool auch nur ein Bit fordert. Bis auf dieses Detail verhält sich std::vector<bool> wie ein ganz normaler std::vector. Wir können iterieren, er bietet begin() und end() etc. Nur platzsparender ist er eben, wie im Video zu sehen ist.