Frage

In einem vorherigen Frage , schien es, dass eine einfache Rückkehr-by-Value-Funktion immer kopiert sein return Argument in die Variable von ihm zugeordnet ist.

Ist das von der Norm gefordert, oder kann die Funktion durch den Bau der ‚zugeordnet‘ Variable optimiert werden, auch in der Funktion Körper?

struct C { int i; double d; };

C f( int i, int d ) {
    return C(i,d); // construct _and_ copy-construct?
}

int main() {
    C c = f( 1, 2 ); 
}
War es hilfreich?

Lösung

Der Standard ermöglicht es jede Ebene der Kopie Auslassung hier:

  • konstruiert ein lokaler temporärer, kopier konstruiert sie in einen Rückgabewert, und den Rückgabewert in die lokalen „c“ copy-konstruieren. oder
  • baut eine lokale temporären und kopieren-Konstrukt, das in „c“. oder
  • Konstrukt "c" mit den Argumenten "i, d"

Andere Tipps

Der Standard besagt, dass der Copy-Konstruktor muss nicht verwendet werden - siehe Abschnitt 12.8 / 15:

  

15 Jedes Mal, wenn ein temporäres Klassenobjekt   kopiert wird eine Kopie Konstruktor,   und diese Aufgabe und die Kopie haben die   gleicher cv-unqualifizierten-Typ, ein   Implementierung zulässig zu behandeln   das Original und die Kopie als zwei   verschiedene Möglichkeiten der Bezugnahme auf die   gleiches Objekt und nicht eine Kopie durchführen zu   alle, auch wenn die Klasse Kopie   Konstruktor oder destructor haben Neben   Auswirkungen.

Und viel mehr in einer ähnlichen Richtung.

Way nicht passieren Parameter durch Verweis und weisen Ergebnis das?

Es gibt eine sehr einfache und gute Möglichkeit, solche Überlegungen vollständig zu vermeiden - man bedenkt, kann eine boost :: shared_ptr auf das erstellte Objekt zurückkehrt - es wird praktisch gleich sein, wenn es um die Benutzerfreundlichkeit kommt, aber das Objekt wird sicherlich nicht unnötig kopiert werden -. und es wird wahr sein, auch wenn Sie es aber ein paar Schichten von Funktionsaufrufen zurückkehren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top