Return struct oder pointer zum return struct?
-
Praktisch jede vernünftig geschriebene Funktion lässt sich in eine Form bringen, mit der NRVO trivial anzuwenden ist. RVO ist sowieso trivial.
dot schrieb:
So Wahnsinnig kompliziert isses ja jetzt nicht gerade.
-
@wxSkip: Dir ist schon klar, daß die erste Variante gar nichts macht? foo1() ändert den (lokalen) Parameter und hat keine Auswirkungen auf das ausrufende Programm.
-
camper schrieb:
Praktisch jede vernünftig geschriebene Funktion lässt sich in eine Form bringen, mit der NRVO trivial anzuwenden ist. RVO ist sowieso trivial.
dot schrieb:
So Wahnsinnig kompliziert isses ja jetzt nicht gerade.
Was wenn du mehrere Returnpfade hast? Händisch isses auch dann noch trivial, aber MSVC z.B. würde dort afaik zumindest keine NRVO anwenden. Ich sag ja auch gar nix gegen RVO. Wenn man weiß was man tut und sich auf seine(n) Compiler verlassen kann, dann wird man das sinnvollerweise auch tun. Nur is das eben ein Pattern, auf das man in C sowieso ständig irgendwo trifft. Darum hab ich das einfach mal vorgeschlagen, anstatt der äußerst merkwürdigen Vorschläge, die davor so herumschwirrten (
alloca()in der Funktion z.B.
). Ich möchte nur verhindern, dass mancher jetzt vielleicht glaubt, dass man am besten einfach ohne nachdenken alles als Wert returned und davon ausgeht, dass der Compiler es schon richten wird.
-
CStoll schrieb:
@wxSkip: Dir ist schon klar, daß die erste Variante gar nichts macht? foo1() ändert den (lokalen) Parameter und hat keine Auswirkungen auf das ausrufende Programm.
Ups, wurde korrigiert.
-
wxSkip schrieb:
dot schrieb:
Soll der Aufrufer doch einen Pointer auf ein struct übergeben, das du ihm dann ausfüllst, so wie man das normalerweise macht eben...
Und genau das passiert auch normalerweise, wenn man by-value zurückgibt. Der Compiler organisiert das so (schau mal nach RVO), dass du meistens direkt in das Resultat reinschreibst. Daher auch der Artikel. Oder habe ich hier etwas missverstanden?
Hmja.
OK. Wenn man ein wenig weiter denkt als die ursprüngliche Frage des OP, dann könnte es passen
Dann könnte die Funktion nämlich u.U. so aussehen:
ppackage myfunc(ppackage pack);Dann haben wir genau den Fall der in dem Artikel angesprochen wird.
Macht allerdings nur Sinn wenn entweder- bei den meisten Aufrufen von myfunc() auch wirklich was zurückgegeben wird oder
- das Paket mit dem myfunc() aufgerufen wird sehr oft ein Temporary ist bzw. "gemoved" werden kann