Zerstört die Rückgabe einer lokalen Variablen das Original?
Ab C 17, ob die Rückgabe einer lokalen Variablen eine Kopie zurückgibt oder das Original zerstört Hängt davon ab, ob die Optimierung aktiviert ist.
Mit Optimierung (NRVO)
Bei aktivierter Optimierung (bekannt als Named Return Value Optimization oder NRVO) kann der Compiler das zurückgegebene Objekt direkt in den Speicher konstruieren, in den es kopiert/verschoben würde. Dies bedeutet, dass die ursprüngliche lokale Variable nicht zerstört wird.
Ohne Optimierung
Wenn die Optimierung deaktiviert ist (mithilfe von -fno-elide-constructors), ist NRVO deaktiviert. Die lokale Variable wird normal erstellt, eine Kopie oder Verschiebung wird durchgeführt und das Original wird zerstört.
Beispiel
Betrachten Sie den folgenden Code:
class test { public: test(int p) { cout << "Constructor: " << this << endl; } test(test&& c) noexcept { cout << "Move Constructor: " << this << endl; } ~test() { cout << "Destructor: " << this << endl; } }; test function() { test i(8); return i; }
Ausgabe mit Optimierung (NRVO):
Constructor: 0x7fff78e42887 Destructor: 0x7fff78e42887
Ausgabe ohne Optimierung:
Constructor: 0x7ffda9d94fe7 Move Constructor: 0x7ffda9d95007 Destructor: 0x7ffda9d94fe7 Destructor: 0x7ffda9d95007
Im optimierten Fall wird nur ein Objekt konstruiert und zerstört. Im nicht optimierten Fall werden zwei Objekte konstruiert und durch die Erstellung einer temporären Kopie zerstört.
Das obige ist der detaillierte Inhalt vonZerstört die Rückgabe einer lokalen Variablen in C 17 das Original?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!