Rückgabe per Referenz schneller?
-
Was ist effizienter?
int add(int x, int y) { return x + y; } int z; z = add(1, 2);void add(int x, int y, int &result) { result = x + y; } int z; add(1, 2, z);
-
Ein guter Compiler wird beides gleich übersetzen, also kein Unterschied.
-
Nee, stimmt so nicht, denn:
bei der Funktionsrückgabe wird der Return-Wert in Registern des Prozessors, d.h. ohne Speicherung im Hauptspeicher, zurückgegeben.
Bei der Rückgabe mittels Referenz müssen jedoch:
1. Die Adresse von result vom Stapel (langsamer Hauptspeicher) gelesen und in ein Register des Prozessors geschrieben,
2. Der Wert von result über den Adress-Registerbezug auf dem Stapel gespeichert werden.Ohne nun Befehlstakte zählen zu wollen, ist die Variante mit der Referenz deutlich langsamer, denn Hauptspeicherzugriffe, bei dieser Referenzübergabe mindestens 2x, dauern im Vergleich zu Registerzugriffe eine "kleine Ewigkeit".
viele grüsse von tesu
-
Betrachte die Funktion doch mal in ihrem Umfeld. In der ersten Version (mit Rückgabewert) hast du diese Speicherzugriffe genauso - nur liegen sie da nicht in der Funktion, sondern im aufrufenden Code. Und wie Tomas schon sagte, wird der Compiler bei beiden Lösungen etwas vergleichbares herausliefern (das nennt sich RVO - "return value optimation").
Die erste Variante hat übrigens den Vorteil, daß du sie in einer komplexen Formel verwenden kannst - indem du den Rückgabewert nicht direkt speicherst, sondern einer anderen Funktion übergibst.
-
CStoll schrieb:
Die erste Variante hat übrigens den Vorteil, daß du sie in einer komplexen Formel verwenden kannst - indem du den Rückgabewert
nicht direkt speicherst
:), sondern einer anderen Funktion übergibst.Genauso ist es: Die aufrufende Umgebung holt sich den Wert aus dem/den Register(n) und nicht vom Stapel --> RVO.
Um fair zu bleiben, sollte ich allerdings sagen, dass reg-mem Zugriffe bei modernen RISC Prozessoren etwa gleich schnell sind wie reg-reg Zugriffe.
vg tesu,
der der compilerbau im ws erfolgreich bestanden hat
-
tesuji schrieb:
vg tesu,
der der compilerbau im ws erfolgreich bestanden hatSowas macht ihr in Compilerbau? *Neid* Bei uns mach man nur die absoluten Grundlagen, also vom Umfang her die ersten paar Kapitel aus dem Drachenbuch.
