Return value
-
Mein Kollege meinte es wäre nicht mehr nötig ein Objekt via Referenz zu übergeben, um es zu modifizieren. Durch Return-Value-Optimization könnte man das Objekt auch lokal anlegen und zurückgeben, ohne Performance zu verlieren.
Hier mal ein Beispiel:
vector<VeryBig> foo() { vector<VeryBig> v; // fill "v" return v; }Ich ziehe bisher die klassische Implementierung vor, weil ich mich nicht darauf verlassen möchte, dass der Compiler das auch optimiert.
void foo(vector<VeryBig>& v) { // fill "v" }Oder kann ich beruhigt große Objekte zurückgeben?
PS:
Ich kenne den Compiler nicht, da es plattformunabhängiger Code für eine Libary wird.
-
Dein Kollege hat absolut Recht.
-
Nun, sagen wir mal: Bei aktuellen Compilern. Wenn jetzt ein g++ 3.0 genommen wird, dann wird es wohl nicht so sein.
-
Ich hätte normalerweise Dave Abrahams' Artikel-Serie
http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
empfohlen, aber die Seite scheint (von mir aus zumindest) nicht mehr erreichbar zu sein.Die Compiler können das mit den "copy elisions", wobei "return value optimization" dazu gehört, schon sehr lange.
Oder kann ich beruhigt große Objekte zurückgeben?
Machen kannst du das. Ob Du das beruhigt machen kannst, weiß ich nicht. Copy elision wird nicht garantiert. Es ist eine optionale Optimierung, die von den populären Compilern unterstützt wird. Beruhigen würde mich das erst, wenn ich C++11 voraussetzen darf; denn dann ist garaniert, dass im Falle von so "Handle-Klassen" wie vector, nie in der Situation etwas unnötig kopiert wird. Im schlimmsten Fall wird "ge-move-t", aber fast all die Container-Typen aus der Standardbibliothek (Ausnahme ist std::array), sind sehr effizient "move-bar".
-
Du solltest darauf achten, dass immer nur dasselbe Objekt zurückgegeben werden kann.
vector<VeryBig> foo(){ if (badcondition) return vector<VeryBig>(); vector<VeryBig> v; // fill "v" return v; }Sowas macht die copy elision kaputt, zumindest wenn der Code noch etwas komplexer wird.
-
nwp3 schrieb:
Du solltest darauf achten, dass immer nur dasselbe Objekt zurückgegeben werden kann.
vector<VeryBig> foo(){ if (badcondition) return vector<VeryBig>(); vector<VeryBig> v; // fill "v" return v; }Sowas macht die copy elision kaputt, zumindest wenn der Code noch etwas komplexer wird.
Stimmt. Das habe ich gerade hier gelesen:
http://en.wikipedia.org/wiki/Return_value_optimization#Compiler_support