- Allgemeines
- Obligatorisches Auslassen von Kopier- oder Verschiebe-Operationen
- Optionales Auslassen von Kopier- oder Verschiebe-Operationen
- Visual C++ – Compiler Flag
/Zc:nrvo - Literaturhinweise
Was versteht man unter Copy and Move Elision?
Wenn in einer C++-Funktion das return-Schlüsselwort ein Objekt
eines nicht primitiven Typs als Argument besitzt
(ggf. als Resultat einer Berechnung eines Ausdrucks),
kopiert die Ausführung dieser return-Anweisung das Ergebnis des Ausdrucks direkt
in den Rückgabe-Slot (Stack Frame) der aufrufenden Funktion.
Auf diese Weise wird vermieden, dass noch innerhalb der Funktion eine überflüssige Kopie des Resultatobjekts am Stack angelegt wird. Daher auch der Ausdruck „Elision” bzw. „Auslassen”: Das Erzeugen eines – nicht zwingend notwendigen – temporären (lokalen) Objekts wird „ausgelassen”.
Siehe dazu das Beispiel im korrespondierenden Quellcode.
Nicht immer ist es möglich, dass ein C++–Compiler zwischen den zwei Möglichkeiten des Erzeugens oder Nicht-Erzeugens temporärer Objekte auswählen kann. In manchen Situationen schreibt der C++ Sprachstandard ein obligatorisches Auslassen der an sich erwarteten Kopier- bzw. Verschiebe-Operation vor:
return Foo{};Wenn der zurückgegebene Wert ein benanntes Objekt ist, kann der Compiler auf das Erzeugen des temporären Objekts verzichten, muss dies aber nicht:
Foo createData() {
Foo data{ 1 };
return data;
}
void test {
Foo data{ createData() };
}Studieren Sie die Testausgaben dieses Beispiels an Hand des korrespondierenden Quellcodes.
Mit dem Visual C++ Compiler (ab Version 17.4) kann man das optionale Auslassen
von Kopier-/Verschiebeoperationen explizit mit dem Flag /Zc:nrvo aktivieren oder
deaktivieren (/Zc:nrvo-):
Abbildung 1: Compiler Flag /Zc:nrvo.
Es ist nicht möglich, das obligatorische Entfernen von Kopier-/Verschiebeoperationen zu deaktivieren.
Mit Hilfe dieses Compiler Flags können Sie das Beispielprogramm von oben auf folgende zwei Arten ausführen:
c'tor (int) [1]
d'tor [1]
oder
c'tor (int) [1]
copy-c'tor !!!!!!!!!!! [1]
d'tor [1]
d'tor [1]
Die Informationen zu diesem Thema stammen zum größten Teil aus dem Artikel
Improving Copy and Move Elision (abgerufen am 7.7.2023).
von Bran Hagger.
