Gibt die Rückgabe einer lokalen Variablen eine Kopie zurück und zerstört das Original (NRVO)?
Einführung:
Die Frage untersucht das Verhalten der Rückgabe einer lokalen Variablen in C. Insbesondere wird untersucht, ob das zurückgegebene Objekt eine Kopie oder das Originalobjekt ist und wie sich dies auf die Zerstörung der lokalen Variablen auswirkt.
Rückgabewertoptimierung (NRVO):
Mit Wenn NRVO (benannte Rückgabewertoptimierung) aktiviert ist, optimiert der Compiler die Rückgabeanweisung, um eine unnötige Kopierkonstruktion oder Zerstörung der lokalen Variablen zu vermeiden. Dies wird erreicht, indem das Rückgabeobjekt direkt im Zielspeicher erstellt wird, wodurch der Aufwand für Zwischenkopien oder -verschiebungen entfällt. NRVO gilt, wenn bestimmte Bedingungen erfüllt sind, z. B. wenn die lokale Variable eine automatische Speicherdauer hat und vom gleichen Typ wie der Rückgabetyp ist.
Beispiel mit aktiviertem NRVO:
Berücksichtigen Sie Folgendes Folgender Code:
class Test { public: Test(int p) { std::cout << "Constructor called" << std::endl; } ~Test() { std::cout << "Destructor called" << std::endl; } }; Test function() { Test t(5); // local variable with automatic storage duration return t; // return local variable } int main() { Test o = function(); return 0; }
Wenn NRVO aktiviert ist, erfolgt die Ausgabe sein:
Constructor called Destructor called
In diesem Fall optimiert NRVO die Return-Anweisung und erstellt das Objekt o direkt im Speicher für die lokale Variable t. Der Konstruktor wird einmal aufgerufen und nur ein Destruktor wird für das Objekt o aufgerufen.
Beispiel mit deaktiviertem NRVO:
NRVO kann jedoch mit -fno-elide- deaktiviert werden. Konstruktoren-Compiler-Flag. Ohne NRVO führt der Compiler die Schritte zum Erstellen und Zerstören der Kopie explizit aus.
Constructor called Constructor called Destructor called Destructor called
In diesem Fall wird der Konstruktor zweimal aufgerufen (für die lokale Variable t und das Rückgabeobjekt o). Darüber hinaus werden sowohl die lokale Variable t als auch das Rückgabeobjekt o separat zerstört.
Schlussfolgerung:
Das Verhalten bei der Rückgabe einer lokalen Variablen hängt davon ab, ob NRVO aktiviert oder deaktiviert ist. Wenn NRVO aktiviert ist, wird die lokale Variable wegoptimiert und der Konstruktor und Destruktor werden für das Rückgabeobjekt nur einmal aufgerufen. Ohne NRVO werden die Schritte zum Erstellen und Zerstören der Kopie explizit ausgeführt, wodurch der Konstruktor und Destruktor möglicherweise mehrmals aufgerufen werden kann.
Das obige ist der detaillierte Inhalt vonNutzt die Rückgabe einer lokalen Variablen in C die Named Return Value Optimization (NRVO), um die Erstellung und Zerstörung von Kopien zu vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!