Heim  >  Artikel  >  Backend-Entwicklung  >  Zerstört die Rückgabe einer lokalen Variablen nach Wert das ursprüngliche Objekt?

Zerstört die Rückgabe einer lokalen Variablen nach Wert das ursprüngliche Objekt?

DDD
DDDOriginal
2024-11-09 13:15:02786Durchsuche

Does Returning a Local Variable by Value Destroy the Original Object?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn