Frage

Ich habe an einigen Stellen die Empfehlung zur Verwendung gesehen std::array gegenüber Arrays im C-Stil in C++ und behauptet, es sei eine bessere, sicherere Alternative ohne Overhead.Sehen:

Das Standard -Container -Array [...] hat keinen Raumaufwand über das, was es braucht, um seine Elemente zu halten, [...].Mit anderen Worten, es ist ein integriertes Array ohne die Probleme sehr ähnlich.(C++11-FAQ)

So wie ich es verstehe, handelt es sich jedoch um einen Vorlagencontainer Wille Dies stellt hinsichtlich der Programmgröße einen Mehraufwand dar, da Code für jedes unterschiedliche N generiert wird, mit dem ein Array instanziiert wird.

Angenommen, mein Programm verwendet std::array an verschiedenen Stellen mit mehreren verschiedenen Ganzzahlen für N, führt dies zu aufgeblähtem Code?Ist es vernachlässigbar?

Sollte ich mir darüber bei nicht typspezifischen Vorlagenparametern im Allgemeinen Sorgen machen?

War es hilfreich?

Lösung

Ich würde mir darüber keine Sorgen machen.Wenn Sie sich die Schnittstelle von ansehen std::array<T, N>, es ist sehr klein und die meisten Mitgliedsfunktionen (die im Grunde genommen Wrapper für die Zeigermanipulation bereitstellen) sind Einzeiler, die von jedem anständigen Compiler auf Optimierungsebenen im Release-Modus vollständig wegoptimiert/inlinet werden.

Außerdem, Sie zahlen nicht für das, was Sie nicht nutzen da ungenutzte nicht-virtuelle Mitgliedsfunktionen (std::array<T, N> hat nicht virtual Memberfunktionen) von Klassenvorlagen werden garantiert nicht instanziiert.Kleines Standardangebot:

14.7.1 Implizite Instanziierung [temp.inst]

11 Eine Implementierung darf keine Funktionsvorlage, eine variable Vorlage, eine Mitgliedsvorlage, eine nicht virtuelle Elementfunktion, eine Mitgliedsklasse oder ein statisches Datenmitglied einer Klassenvorlage, für die keine Instanziierung erforderlich ist, nicht implizit instanziiert.[...]

Es gibt auch einige überladene Vergleichsoperatoren == Und < die semantisch äquivalent sind zu std::equal Und std::lexicographical_compare.In der Praxis sollten diese Operatoren auch im Hinblick auf diese Algorithmen implementiert werden (beschweren Sie sich bei Ihrem Anbieter, wenn dies nicht der Fall ist).

Die einzige sehr kleine Sorge ist ein kleiner zusätzlicher Kompilierungszeit-Overhead, aber Codegröße und Laufzeit-Overhead sollten gleich Null sein.

Verwandt, aber nicht identisch:Die Technischer Bericht zur C++-Leistung viele sorgfältige Benchmarks für Thin-Class-Wrapper um integrierte Typen durchgeführt (int, double) und ergab einen Overhead von nahezu Null für die Compiler-Technologie von 2006.Sie können den Test wiederholen, um dies zu überprüfen std::array<T,N> vs. T[N]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top