„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Nutzt die Rückgabe einer lokalen Variablen in C++ die Named Return Value Optimization (NRVO), um die Erstellung und Zerstörung von Kopien zu vermeiden?

Nutzt die Rückgabe einer lokalen Variablen in C++ die Named Return Value Optimization (NRVO), um die Erstellung und Zerstörung von Kopien zu vermeiden?

Veröffentlicht am 11.11.2024
Durchsuche:633

Does Returning a Local Variable in C   Utilize Named Return Value Optimization (NRVO) to Avoid Copy Construction and Destruction?

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::cout 

Bei aktiviertem NRVO lautet die Ausgabe:

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 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.

Neuestes Tutorial Mehr>

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