Rainer Grimm hat am 24. Mai 2019 die Empfehlung der C++ Core Guidelines für std::array und std::vector erläutert. Sein Beitrag erklärt, warum zusammenhängend gespeicherte Elemente ein sinnvoller Ausgangspunkt für die Wahl sequenzieller Container sind. Es geht um eine bestehende Entwicklungsregel, nicht um eine neue C++-Version.
Die Regel SL.con.2 empfiehlt vector als Standardwahl, solange kein konkreter Grund für einen anderen Container vorliegt. Benötigt das Programm keine Größenänderung, nennt sie array als Alternative. Das zusammenhängende Layout unterstützt lineare Durchläufe und die Nutzung des Prozessorcaches. Daraus folgt keine Garantie, dass vector für jede Aufgabe am schnellsten ist.
Feste Größe und dynamische Kapazität
Der C++17-Standardentwurf beschreibt array als Container fester Größe und vector als dynamischen sequenziellen Container. Die Gegenüberstellung unterscheidet die Anzahl vorhandener Elemente von der reservierten Kapazität:
| Eigenschaft | std::array | std::vector |
|---|---|---|
| Größe | N ist Teil des Typs und zur Compilezeit festgelegt | Zur Laufzeit veränderbar |
| Elementlayout | Zusammenhängend | Zusammenhängend, ausgenommen die bool-Spezialisierung |
| Wachstum | Keine Vergrößerung des Containers | Zusätzliche Elemente möglich, eventuell neue Allokation |
| Kapazitätsplanung | Keine getrennte Wachstumskapazität | reserve plant Kapazität, ohne size zu ändern |
Bei vector macht eine erneute Allokation zuvor gespeicherte Zeiger, Referenzen und Iteratoren auf Elemente ungültig. reserve kann ausreichend Kapazität für geplante Einfügungen bereitstellen, erhöht aber nicht die Anzahl der Elemente. Einfügungen und Löschungen in der Mitte bleiben lineare Operationen. Dynamisches Wachstum ist damit nicht kostenlos.
Ein Lesetest ist kein allgemeiner Spielebenchmark
Grimm vergleicht das Aufsummieren von 100 Millionen Ganzzahlen in vector, deque, list und forward_list. Er untersucht damit einen bestimmten Speicherzugriff, nicht die Bildrate einer Engine. Seine Windows- und Linux-Läufe stammen zudem von unterschiedlichen Rechnern und eignen sich nicht als Betriebssystemvergleich.
Für Spielecode lässt sich daraus eine konkrete Prüfaufgabe ableiten: Bei häufig durchlaufenen Datenbeständen zunächst Layout und Größenänderungen untersuchen, anschließend im tatsächlichen System messen. Die C++ Core Guidelines behandeln auch die Sichtbarkeit generischer Templates und die Namenssuche. Containerwahl und Schnittstellengestaltung lösen unterschiedliche Probleme in derselben Codebasis.

