Wenn Sie einen Compiler haben, der Rvalue-Referenzen unterstützt, wird er in den Vektor verschoben, der manchmal ziemlich billig ist.
Eine Alternative dazu ist, das Objekt direkt im Vektor zu konstruieren, was mit vec.emplace_back("abc");
gemacht werden kann. Dies ruft nur einen Konstruktor auf.
Beide sind C++ 11 Funktionen. Kopieren ist hier nicht erlaubt, also wird ohne diese Funktionen die Kopie erstellt. Wenn der Kopierkonstruktor jedoch keine beobachtbaren Nebenwirkungen hat (was er ohnehin nicht haben sollte), kann ein intelligenter Compiler diese Optimierung dennoch ausführen, weil die "als-ob" -Regel jede Optimierung zulässt, die zu der. Führt dasselbe beobachtbare Verhalten. Ich weiß nicht, ob das ein aktueller Compiler tut. Wenn nicht, bezweifle ich, dass irgendjemand die Anstrengung aufwenden wird, eine solche Optimierung hinzuzufügen, weil R-Werte diesen Bedarf beenden.
Ich glaube nicht, weil 'Vektor' (STL-Zuweiser tatsächlich) Platzierung' neu' verwendet. –
@Seth Carnegie - wie verhält es sich mit der Platzierung "neu"? Angenommen, Sie haben genug freien Speicherplatz in Vektor, dann kann ein Compiler nur eine Instanz von 'A' direkt anordnen. –
@Nya, weil der Compiler wahrscheinlich nicht herausfinden wird, wo es erstellt wird (nicht dass es nicht kann, aber das wird nicht, weil Compiler-Schreiber diese Optimierung nicht geschrieben haben). –