Heim > Artikel > Backend-Entwicklung > Wie wirkt sich die benannte Rückgabewertoptimierung (NRVO) auf das Rückgabeverhalten lokaler Variablen aus?
Das Rückgabeverhalten lokaler Variablen verstehen
Bei der Rückgabe einer lokalen Variablen von einer Funktion kann ihr Verhalten je nach Compileroptimierungen variieren.
NRVO (Named Return Value Optimization)
Wenn NRVO aktiviert ist, optimiert der Compiler die Rückgabeanweisung, indem er das zurückgegebene Objekt direkt an der Stelle des Rückgabewerts erstellt. In diesem Fall wird keine Kopie durchgeführt und das Originalobjekt wird nach der Rückgabe zerstört.
Ausgabe mit aktiviertem NRVO
// With NRVO enabled, only one constructor and destructor call is made. class test { public: test(int p) { std::cout << "Constructor (test(int p)) called\n"; } ~test() { std::cout << "Destructor called\n"; } }; test function() { test i(8); return i; } int main() { test o = function(); return 0; }
Ausgabe:
Constructor (test(int p)) called Destructor called
NRVO deaktiviert
Um NRVO zu deaktivieren, verwenden Sie während der Kompilierung das Flag -fno-elide-constructors. In diesem Fall führt der Compiler keine NRVO aus und eine Kopie des Objekts wird im Rückgabewert erstellt.
Ausgabe mit deaktiviertem NRVO
// With NRVO disabled, both constructor and destructor calls are made twice. class test { public: test(int p) { std::cout << "Constructor (test(int p)) called\n"; } test(test&& other) { std::cout << "Constructor (test(test&& other)) called\n"; } ~test() { std::cout << "Destructor called\n"; } }; test function() { test i(8); return i; } int main() { test o = function(); return 0; }
Ausgabe :
Constructor (test(int p)) called Constructor (test(test&& other)) called Destructor called Destructor called
Zusammenfassung
Das obige ist der detaillierte Inhalt vonWie wirkt sich die benannte Rückgabewertoptimierung (NRVO) auf das Rückgabeverhalten lokaler Variablen aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!