Betrachten Sie den folgenden Code:
%Vor% Die Ausgabe des obigen Codes mit g++ file.cpp
ist:
Die Ausgabe des obigen Codes mit g++ -fno-elide-constructors file.cpp
ist:
Ich kenne Return-Value-Optimierung. Meine Frage ist, welcher Aufruf zum Kopieren des Konstruktors ist elided (temporäres Objekt während der Rückgabe oder zurückgegebenes Objekt wird nach b) kopiert?
Wenn der elided Copy-Konstruktor derjenige ist, der für die Erstellung von b verwendet wird, wie wird b überhaupt erzeugt (weil es in diesem Fall auch keinen Konstruktoraufruf gibt)?
Wenn ich die Zeile A b = a.fun(c);
durch a.fun(c)
ersetze und mit der ersten Methode oder sogar der zweiten Methode kompiliere, wird auch der Kopierkonstruktor 2 Mal aufgerufen. Wenn also in dem im vorherigen Absatz erläuterten Fall der Kopierkonstruktor des temporären Objekts entfernt wird, warum wird er dann nicht entfernt?
Erträge:
%Vor% Also konstruiert es a
, konstruiert c
, kopiert c
auf ein intermediate (Argument a
der Funktion) und kopiert dann das Zwischenprodukt direkt in b
und überspringt das typische Kopieren eines to eine Rückkehr Zwischenstufe. Dies wird noch besser demonstriert, wenn Sie den Wert übergeben (ändern Sie in A fun(const A& a)
:
a ist konstruiert, c ist konstruiert, c wird direkt nach b kopiert, obwohl b nicht an Spaß weitergegeben wird!
Die kopierte Kopie ist die Kopie des temporären Rückgabewerts in b
. Ohne Elision wird der Rückgabewert von a
initialisiert und nach b
kopiert. Stattdessen wird das Temporary, das andernfalls den Rückgabewert enthalten würde, in b
konstruiert und mit a
initialisiert. [class.copy] / 31:
wenn ein temporäres Klassenobjekt nicht an eine Referenz gebunden wurde (12.2) würde mit demselben in ein Klassenobjekt kopiert / verschoben werden cv-unqualified type, kann der Kopier- / Verschiebevorgang weggelassen werden Konstruieren des temporären Objekts direkt in das Ziel der ausgelassen kopieren / verschieben
Sie können dies beobachten, wenn Sie eine zusätzliche Ausgabe in fun
hinzufügen:
Dann mit der Elision erhalten Sie
[...]
Spaß! Konstruktor kopieren
Und ohne:
[...]
Spaß!
Konstruktor kopieren Konstruktor kopieren
Tags und Links c++ copy-constructor copy-elision temporary-objects return-value-optimization