Gibt die Rückgabe einer lokalen Variablen eine Kopie zurück und zerstört das Original (NRVO)?
Einführung:
Die Frage untersucht das Verhalten bei 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 dadurch erreicht, dass 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::coutBei aktiviertem NRVO lautet die Ausgabe:
Constructor called Destructor calledIn 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 calledIn 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 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.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3