Skip to content

Latest commit

 

History

History
117 lines (76 loc) · 3.04 KB

File metadata and controls

117 lines (76 loc) · 3.04 KB

Auslassen von Kopier- oder Verschiebe-Operationen – Copy/Move Elision

Zurück


Quellcode


Inhalt


Allgemeines

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.


Obligatorisches Auslassen von Kopier- oder Verschiebe-Operationen

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{};

Optionales Auslassen von Kopier- oder Verschiebe-Operationen

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.


Visual C++ – Compiler Flag /Zc:nrvo

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]

Literaturhinweise

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.


Zurück