Stil-Frage
-
Hallo zusammen,
ich habe mal eine Frage: Was ist besser/schöner/effizienter?
Variante a)
void foo(List & aList){ //add something to the list } void bar(){ List a; foo(a); }
oder b)
List foo(){ List a; //add something to the list return a; } void bar(){ List a = foo(); }
Klar, Version b macht ne Kopie und ist daher wohl nicht so effizient wie a, aber ich finde es schöner, weil man da gleich sieht, was Eingabe und Rückgabe ist. Gibt es sonst noch Argumente für die ein oder andere Variante? Oder ist das heutzutage vielleicht egal, weil der GCC das schon optimiert? Vielen Dank für Antworten.
Gruß
uwe
-
Es ist ausdrücklich vom Sprachstandard erlaubt, diese Kopie weg zu optimieren, selbst wenn dadurch die Semantik des Programms verändert würde (Kopierkonstruktor mit Seiteneffekten). Dies nennt man return value optimization (RVO) und ist eine ganz grundlegende Optimierung, die daher so ziemlich jeder Compiler beherrscht. Schwierig wird's für den Compiler jedoch, wenn du solche Konstrukte hast:
List foo() { List listA, listB; // ... if (irgendwas) return listA; else return listB; }
-
Vielen Dank, das Stichwort RVO war hilfreich
-
SeppJ schrieb:
Es ist ausdrücklich vom Sprachstandard erlaubt, diese Kopie weg zu optimieren, selbst wenn dadurch die Semantik des Programms verändert würde (Kopierkonstruktor mit Seiteneffekten). Dies nennt man return value optimization (RVO) und ist eine ganz grundlegende Optimierung, die daher so ziemlich jeder Compiler beherrscht. Schwierig wird's für den Compiler jedoch, wenn du solche Konstrukte hast:
List foo() { List listA, listB; // ... if (irgendwas) return listA; else return listB; }
In diesem Fall
kannmuss der (C++11-kompatible) Compiler allerdings move-Konstruktion einsetzen, sofern verfügbar.
Es gibt deshalb von vornherein (fast immer) keinen Grund mehr, eine andere Methode der Rückgabe zu verwenden.