Referenzen benutzen
-
Hi Community
![:] 🙂](https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso)
Ich habe eine Frage und zwar hab ich gelesen dass man "call by reference" benutzen sollte und zwar erst wenn das übergebene Objekt größer als 4 Bytes ist und wenn z.B mehrere Werte verändert zurückgegeben werden sollen. Nun meine Frage ist ob das mit den 4 Bytes nur eine Richtlinie ist oder eine Art Pflicht die dem Standart entspricht? Oder ist einfach der "Zeitgewinn" wenn man die kleineren Objekte als Referenz übergibt so gering dass es sich erst bemerkbar ab 4 Bytes macht?danke für jede Antwort
lg c4f
-
Die 4 Bytes scheinen mir ein relativ willkürlicher Wert. Vom Standard ist hier nichts vorgeschrieben. Grundsätzlich gilt, dass man grössere Datentypen (meistens Klasseninstanzen) besser per Referenz übergibt, weil man sich so die Zeit für die Kopie spart. Bei den elementaren Typen wie
intoderdouble(8 Byte) lohnt sich das meistens nicht (weil bei einer Referenz noch Zeit für die Dereferenzierung benötigt wird).Da kommt hinzu, dass man kopierte Objekte nicht verändern kann, per Referenz übergebene jedoch schon. Willst du sie trotzdem nicht verändern, aber wegen Geschwindigkeit als Referenz übergeben, kannst du das mit einer konstanten Referenz lösen.
-
Ich kann jetzt nicht sagen, ob dieses Aussage richtig oder falsch ist. Ich kann nur sagen, dass mir in dem Zusammenhang sowas seltsames wie diese, ich nenn es jetzt mal, Behauptung noch nie untergekommen ist
Ob nun "call by value" oder "call by reference" das richtige ist, diese Frage stellte sich nur, wenn man sich vorher sicher war, ob man einen einer Funktion übergeben Wert verändern möchte oder nicht.
-
Ok danke für die Antwort

-
ist eine richtlinie, aber kleinere objekte lohnen sich gar nicht, weil er bei ner addresse ja eh 4byte kopieren muss (bei 32bit systemen)...
wenn der copy-ctor trivial genug ist lohnt es sich ebenfalls auf (const) referenzen zu verzichten.
referenzen sind ja auch nichts anderes, als pointer (die intern verwaltet werden) - also müssen sie auch (intern) dereferenziert werden...also _kann_ es (rein theoretisch) auch noch effektiver sein, ein 10 byte großes objekt per value und nicht per referenz zu übergeben - aber das muss man sich natürlich immer selbst überlegen und zur not mal mit dem profiler bissl rumspielen und vergleichen...
bb
-
das muss man sich natürlich immer selbst überlegen und zur not mal mit dem profiler bissl rumspielen und vergleichen...
Da möchte ich mal das zur Not hervorheben. Der c-tor wird in kaum einem Fall ein Problem werden, was die Geschwindigkeit anbelangt. Ich kann mir da kaum ein (realistisches) Szenario vorstellen, wo ein c-tor wirklich Geschwindigkeitsprobleme machen kann.
Ansonsten kann ich nur sagen, dass du hald von Fall zu Fall überlegen musst, was jetzt geeigneter ist. (Und mal nicht auf Geschwindigkeit achten). Sondern eher, wie es für den Programmierer/Leser ist. Also Handbarkeit, Sicherheit, Lesbarkeit usw.
-
Berufspenner schrieb:
Ob nun "call by value" oder "call by reference" das richtige ist, diese Frage stellte sich nur, wenn man sich vorher sicher war, ob man einen einer Funktion übergeben Wert verändern möchte oder nicht.
Nein, eben nicht. Referenzen haben abgesehen von der Möglichkeit zur Veränderbarkeit wie gesagt den Vorteil, dass grosse Objekte nicht kopiert werden müssen. Wieso sollte es sonst Const-Referenzen geben?
Und was die Geschwindigkeit angeht: Meistens hat man eh nicht so zeitkritische Bedingungen, dass man bei 10 Byte grossen Objekten überlegen muss, ob jetzt ein Call by Value oder Call by Reference von Vorteil ist. Ich würd mir einfach merken, Elementardatentypen sowie Typedefs von solchen und Enums zu kopieren, während grössere Datentypen wie Klassen als Referenz übergeben werden.
Und falls man doch derart mikrooptimieren muss, gibts ja wie gesagt noch Profiler.
-
Ok danke euch allen

Das hat mir weitergeholfen
lg c4f
-
drakon schrieb:
Der c-tor wird in kaum einem Fall ein Problem werden, was die Geschwindigkeit anbelangt. Ich kann mir da kaum ein (realistisches) Szenario vorstellen, wo ein c-tor wirklich Geschwindigkeitsprobleme machen kann.
Ich schon...
class Matrix { std::vector < std::vector < my::BigInt > > array; /*etc*/ };Is nat nur ein Bsp. und das BigInt soll andeuten, dass die Zahl an sich auch noch mal bissl mehr zu kopieren sein könnte als nen einfacher int...
Klar ist das heutzutage üblicherweise zu vernachlässigen, aber auch nur, so lange man sich in nem rel. "normalen" Rahmen aufhält...bb
-
Nexus schrieb:
Berufspenner schrieb:
Ob nun "call by value" oder "call by reference" das richtige ist, diese Frage stellte sich nur, wenn man sich vorher sicher war, ob man einen einer Funktion übergeben Wert verändern möchte oder nicht.
Nein, eben nicht. Referenzen haben abgesehen von der Möglichkeit zur Veränderbarkeit wie gesagt den Vorteil, dass grosse Objekte nicht kopiert werden müssen. Wieso sollte es sonst Const-Referenzen geben.
Stimmt, da hast du recht. Ich hab es gerade eher im Kleinen und nicht im Ganzen betrachtet.
-
unskilled schrieb:
Is nat nur ein Bsp. und das BigInt soll andeuten, dass die Zahl an sich auch noch mal bissl mehr zu kopieren sein könnte als nen einfacher int...
Klar ist das heutzutage üblicherweise zu vernachlässigen, aber auch nur, so lange man sich in nem rel. "normalen" Rahmen aufhält...bb
Ich habe nicht gesagt, dass es nicht auch sehr viel Zeit in Anspruch nehmen kann, sondern, dass ich mir keine realistisches Szenario vorstellen kann, wo das wirklich etwas ausmacht. Da hast du andere Probleme, als einen grossen c-tor.
-
Grundsätzlich sollte man sich nicht immer um solche (teilweise) Mikrooptimierungen Gedanken machen

Ich denke, mit der von mir geposteten Grundregel oben fährt man eigentlich gut

Offtopic (sorry musste sein :D):
drakon
MitgliedBenutzerprofil
Anmeldungsdatum: 28.01.2008
Beiträge: 1337