Im Buch Generic Programming und der STL (chinesische Ausgabe) heißt es:
X x = X()
ruft den Kopierkonstruktor auf.
Es scheint mir etwas komisch. Und ich schreibe ein Testprogramm wie dieses
%Vor%Die Ausgabe ist "Dies ist ctor". ok, jetzt bin ich verwirrt, was ist richtig?
Normalerweise ja, ein temporäres ist standardmäßig konstruiert, und dann wird der Kopierkonstruktor aufgerufen, um es in Ihr Objekt t
zu kopieren.
In der Praxis kann die Kopie jedoch optimiert werden - , obwohl es Nebenwirkungen hat (die Konsolenausgabe):
[n3290: 8.5/16]
: [..] In bestimmten Fällen ist eine Implementierung erlaubt, das damit verbundene Kopieren zu beseitigen direkte Initialisierung durch direktes Konstruieren des Zwischenergebnisses in das Objekt, das initialisiert wird; siehe 12.2, 12.8.
Und (in Verbindung mit dem Beispiel in der gleichen Klausel):
[n3290: 12.2/2]
: [..] Eine Implementierung verwendet möglicherweise ein temporäres in welches X (2) zu konstruieren, bevor es an f () übergeben wird mitX
's Kopie Konstrukteur; Alternativ kannX(2)
im Raum konstruiert werden verwendet, um das Argument zu halten. [..]
Aber der Kopierkonstruktor muss noch existieren, obwohl er möglicherweise nicht aufgerufen wird.
Wie auch immer, wenn Sie mit deaktivierten Optimierungen kompilieren (oder mit GCC, möglicherweise -fno-elide-constructors
), sehen Sie:
Theoretisch ruft X x = X()
den Standardkonstruktor auf, um ein temporäres Objekt zu erstellen, und kopiert das in x
mit dem Kopierkonstruktor.
In der Praxis dürfen Compiler den Copy-Construction-Teil überspringen und default-construct x
direkt erzeugen (was, wie David in seinem Kommentar ausführt, immer noch erfordert, dass der Copy-Konstruktor syntaktisch zugänglich ist). Die meisten Compiler machen das zumindest, wenn Optimierungen aktiviert sind.
Dies ist ein Fall, in dem eine Rückgabewertoptimierung (RVO) (auch bekannt als Copy Elision ) kann viel zur Optimierung beitragen. Die verlinkte Wikipedia-Seite hat eine sehr gute Erklärung dafür, was vor sich geht.
Tags und Links c++ constructor copy-constructor