Heim > Backend-Entwicklung > C++ > Hauptteil

Zerstört die Rückgabe einer lokalen Variablen in C 17 das Original?

DDD
Freigeben: 2024-11-11 11:22:03
Original
833 Leute haben es durchsucht

Does Returning a Local Variable in C  17 Destroy the Original?

Zerstört die Rückgabe einer lokalen Variablen das Original?

Ab C 17, ob die Rückgabe einer lokalen Variablen eine Kopie zurückgibt oder das Original zerstört Hängt davon ab, ob die Optimierung aktiviert ist.

Mit Optimierung (NRVO)

Bei aktivierter Optimierung (bekannt als Named Return Value Optimization oder NRVO) kann der Compiler das zurückgegebene Objekt direkt in den Speicher konstruieren, in den es kopiert/verschoben würde. Dies bedeutet, dass die ursprüngliche lokale Variable nicht zerstört wird.

Ohne Optimierung

Wenn die Optimierung deaktiviert ist (mithilfe von -fno-elide-constructors), ist NRVO deaktiviert. Die lokale Variable wird normal erstellt, eine Kopie oder Verschiebung wird durchgeführt und das Original wird zerstört.

Beispiel

Betrachten Sie den folgenden Code:

class test {
public:
    test(int p) { cout << "Constructor: " << this << endl; }
    test(test&& c) noexcept { cout << "Move Constructor: " << this << endl; }
    ~test() { cout << "Destructor: " << this << endl; }
};

test function() {
    test i(8);
    return i;
}
Nach dem Login kopieren

Ausgabe mit Optimierung (NRVO):

Constructor: 0x7fff78e42887
Destructor: 0x7fff78e42887
Nach dem Login kopieren

Ausgabe ohne Optimierung:

Constructor: 0x7ffda9d94fe7
Move Constructor: 0x7ffda9d95007
Destructor: 0x7ffda9d94fe7
Destructor: 0x7ffda9d95007
Nach dem Login kopieren

Im optimierten Fall wird nur ein Objekt konstruiert und zerstört. Im nicht optimierten Fall werden zwei Objekte konstruiert und durch die Erstellung einer temporären Kopie zerstört.

Das obige ist der detaillierte Inhalt vonZerstört die Rückgabe einer lokalen Variablen in C 17 das Original?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage