C++ Core Guidelines: array und vector im Vergleich

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:

Eigenschaftstd::arraystd::vector
GrößeN ist Teil des Typs und zur Compilezeit festgelegtZur Laufzeit veränderbar
ElementlayoutZusammenhängendZusammenhängend, ausgenommen die bool-Spezialisierung
WachstumKeine Vergrößerung des ContainersZusätzliche Elemente möglich, eventuell neue Allokation
KapazitätsplanungKeine getrennte Wachstumskapazitätreserve 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.

Weitere News

Weitere News

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein