Kopierelision und Objektlebensdauer
Bei der Rückgabe einer lokalen Variablen nach Wert fragt man sich möglicherweise, ob das ursprüngliche Objekt zerstört wird oder nicht. Die Antwort liegt im Verständnis der Kopierelision.
Mit Kopierelision (NRVO)
Wenn die Optimierung (bekannt als Named Return Value Optimization oder NRVO) aktiviert ist, kann der Compiler dies tun Optimieren Sie die Return-Anweisung, indem Sie das Objekt direkt in den Speicher konstruieren, in den es sonst kopiert würde. Dadurch wird das Originalobjekt gar nicht erst erstellt.
Beispiel mit aktiviertem NRVO
Beachten Sie den folgenden Code:
class Test { public: Test(int p) { cout << "Constructor called" << endl; } ~Test() { cout << "Destructor called" << endl; } }; Test function() { Test t(5); return t; } int main() { Test o = function(); return 0; }
Wenn NRVO aktiviert ist, lautet die Ausgabe:
Constructor called Destructor called
Nur das Objekt o wird erstellt und zerstört, und das ursprüngliche Objekt t wird wegoptimiert.
Ohne Kopierelision
Wenn die Optimierung deaktiviert ist (z. B. -fno-elide-constructors), folgt die Return-Anweisung der üblichen Kopier-/Verschiebungssemantik.
Beispiel mit deaktiviertem NRVO
Bei Verwendung des Codes von oben mit deaktiviertem NRVO lautet die Ausgabe:
Constructor called Constructor called Destructor called Destructor called
Dieses Mal werden beide Objekte t und o konstruiert und zerstört, was bei der Kopier-/Verschiebekonstruktion nicht möglich ist wegoptimiert werden.
Fazit
Ob die Rückgabe einer lokalen Variablen nach Wert das ursprüngliche Objekt zerstört, hängt davon ab, ob NRVO aktiviert ist oder nicht. Mit NRVO kann das Originalobjekt eliminiert werden, während es ohne NRVO gemäß der standardmäßigen Kopier-/Verschiebesemantik kopiert/verschoben wird.
Das obige ist der detaillierte Inhalt vonZerstört die Rückgabe einer lokalen Variablen nach Wert das ursprüngliche Objekt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!