Konstruktor oder Kopierkonstruktor?

8

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?

    
Xiaotian Pei 25.08.2011, 12:05
quelle

3 Antworten

9

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 mit X 's Kopie   Konstrukteur; Alternativ kann X(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:

%Vor%     
Lightness Races in Orbit 25.08.2011, 12:08
quelle
4

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.

    
sbi 25.08.2011 12:08
quelle
2

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.

    
Goz 25.08.2011 12:09
quelle