Call by: value oder ref?
-
Hallo,
was seht ihr als "optimale" Lösung bei der Parameterübergabe, bzw. was haltet Ihr in den meisten Fällen für sinnvoll?Ein call by Value und so gut wie alles im Projekt mit values machen, oder so viel wie es geht mit Referenzen? Eventuell mit const. referenzen?
Gruß,
Andy
-
Hy Andy
Naja bei "kleinen" Variablen, sowas wie Int entscheide ganz einfach was dir besser gefällt, da ist es egal ob jetzt die 4 Byte Addresse oder die 4 Byte daten kopiert werden.
Bei größeren Variablen zB strukturen benutze am besten immer nur ein ByRef und wenn die Daten nicht verändert werden sollen, dann natürlich const ByRef. Da hier dann nur die Addresse und nicht die komplette Struktur mitkopiert werden muss und deswegen entsprechend schneller ist. Auserdem der Stack (ich glaub der wars nicht der Heap) ist immernoch ein begrenzter speicher, bei dem ich versuch so wenig wie möglich abzulegen.
Mfg Deep
-
Hättest du die Forensuche benutzt, wärst du unter anderem auf diesen Thread gestossen...
-
Aber ist es bei einer Referenz nicht so dass man davon im finalen ASM Code nix mehr sieht? Die Referenz ist doch nur für den Compiler, man greift halt von anderen Stellen auf die Originalvariablen zu...

-
Frage9 schrieb:
Aber ist es bei einer Referenz nicht so dass man davon im finalen ASM Code nix mehr sieht? Die Referenz ist doch nur für den Compiler, man greift halt von anderen Stellen auf die Originalvariablen zu...

Ja. Bei x86 ASM wird eine Referenz praktisch in jedem Fall durch einen Pointer dargestellt. Einfach immer schön
const-Referenzen benutzen, die interne Darstellung kann dir doch egal sein
-
Frage9 schrieb:
Aber ist es bei einer Referenz nicht so dass man davon im finalen ASM Code nix mehr sieht? Die Referenz ist doch nur für den Compiler, man greift halt von anderen Stellen auf die Originalvariablen zu...
Nein, normalerweise verhält sich eine Referenz wie ein eingeschränkter Zeiger.
Wenn du sowas hast, kann dir der Compiler das rausoptimieren, da es sich tatsächlich nur um einen Alias handelt.
Object& Ref = MyNamespace::MyClass.GetElement(3).GetObject();Aber bei Parameterübergaben wird mit grosser Wahrscheinlichkeit derselbe Assemblercode generiert wie mit einem Zeiger.
-
Marc-O schrieb:
Naja bei "kleinen" Variablen, sowas wie Int entscheide ganz einfach was dir besser gefällt, da ist es egal ob jetzt die 4 Byte Addresse oder die 4 Byte daten kopiert werden.
Nur, dass es wenigsten mal einer sagt:
Das ist quatsch - da nicht nur das Kopieren, sondern auch das De-Referenzieren zu beachten ist... Da der Compiler die Referenz bei einem Funktionsaufruf nicht rausoptimieren darf - er muss also 4 Byte (x86) kopieren und dann mind. einmal De-Referenzieren - das hört sich doch schon ein wenig doof an, wenn man im Gegensatz dazu "nur 4B kopieren" hat
bb
-
unskilled schrieb:
Marc-O schrieb:
Naja bei "kleinen" Variablen, sowas wie Int entscheide ganz einfach was dir besser gefällt, da ist es egal ob jetzt die 4 Byte Addresse oder die 4 Byte daten kopiert werden.
Nur, dass es wenigsten mal einer sagt:
Das ist quatsch - da nicht nur das Kopieren, sondern auch das De-Referenzieren zu beachten ist... Da der Compiler die Referenz bei einem Funktionsaufruf nicht rausoptimieren darf - er muss also 4 Byte (x86) kopieren und dann mind. einmal De-Referenzieren - das hört sich doch schon ein wenig doof an, wenn man im Gegensatz dazu "nur 4B kopieren" hat
bb
im prinzip ist der punkt sowieso egal. wenn man ne referenz auf ein int übergibt, ist das eigentlich für einen ganz anderen anwendungsfall gedacht.
-
naja schrieb:
unskilled schrieb:
Marc-O schrieb:
Naja bei "kleinen" Variablen, sowas wie Int entscheide ganz einfach was dir besser gefällt, da ist es egal ob jetzt die 4 Byte Addresse oder die 4 Byte daten kopiert werden.
Nur, dass es wenigsten mal einer sagt:
Das ist quatsch - da nicht nur das Kopieren, sondern auch das De-Referenzieren zu beachten ist... Da der Compiler die Referenz bei einem Funktionsaufruf nicht rausoptimieren darf - er muss also 4 Byte (x86) kopieren und dann mind. einmal De-Referenzieren - das hört sich doch schon ein wenig doof an, wenn man im Gegensatz dazu "nur 4B kopieren" hat
bb
im prinzip ist der punkt sowieso egal. wenn man ne referenz auf ein int übergibt, ist das eigentlich für einen ganz anderen anwendungsfall gedacht.
Japp - aber in dem Fall heißt die Alternative ja Pointer und nicht Call by Value...
-
unskilled schrieb:
Nur, dass es wenigsten mal einer sagt
Was denkst du, wieso ich den Link gepostet habe?

Da steht zum Beispiel auch, dass bei gewissen Objekten eine Zeiger-/Referenzübergabe die einzige Möglichkeit ist.
-
Nexus schrieb:
unskilled schrieb:
Nur, dass es wenigsten mal einer sagt
Was denkst du, wieso ich den Link gepostet habe?

Da steht zum Beispiel auch, dass bei gewissen Objekten eine Zeiger-/Referenzübergabe die einzige Möglichkeit ist.
In dem Thread hab ich aber jz nicht soooo viel zu Call by Ref vs Call by Value gelesen... Da gabs imho bessere Threads - aber da ich zu faul zum Suchen war.. usw

bb
-
Diese zwei Posts decken aber schon einen Grossteil der Thematik ab, findest du nicht?

drakon schrieb:
Die Übergabe per Referenz lohnt sich überall, wo nicht gerade eingabaute Typen übergeben werden. Aber so Sachen, wie std::string, o.ä sollte in der Regel mittels Referenz übergeben werden. (Wenn nichts geändert werden soll const).
Nexus schrieb:
Als Faustregel kann man sich merken, dass man Built-In-Typen wie
int,bool,doubleals Kopie übergeben kann, während Klassentypen als Const-Referenz übergeben werden. Bei kleinen Typen lohnt sich eine Übergabe nicht, da das Anlegen einer Referenz oder eines Zeigers etwa gleich lange dauert wie die Kopie und anschliessend noch die Dereferenzierungskosten dazu kommen. Bei grösseren Typen fängt es sich jedoch schnell zu lohnen an. Zudem können gewisse Objekte gar nicht kopiert werden, so zum Beispiel die C++-Streams.Wie auch immer, nichts hindert den Threadersteller daran, noch mehr Informationen zu suchen...