Copykonstruktor vs. Rückgabewert Optimierung
-
21-08-2019 - |
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 );
}
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