Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

De_Struktor

unregistriert

1

09.05.2013, 00:51

Wann "Call by Value" wann "Call by Reference"

Hallo Community,

Ich habe eine Frage bezüglich der Art und Weise, wie Werte an Funktionen übergeben werden sollen.

Mein Bruder sagte mir aus seiner jetztigen Uni zeit, sein Prif sagte ihm, es besser, ausschließlich" mit Objektreferenzen zu arbeiten, als
ohne.

Ich weiß auch den ungefähren Grund:

CBV = an die Funktion übergebene Daten werden "kopiert"
CBR = Daten außerhalb verweisen auf dasselbe Datum, in der Funktion zeigt auch eine andere Variable auf dasselbe Datum. Man arbeitet nicht mit der Kopie sondern direkt mit dem Original.

Ok, aber was bringt es jetzt zum Beispiel mir, bei dem Bomberman,

Soll ich meine Funktionsparameter doch lieber referenzieren??

Bitte um Aufklärung, will nicht ohne Verstand Referenzen übergeben^^

mfg

DeStruktor

idontknow

unregistriert

2

09.05.2013, 01:54

Komplexere Objekte solltest du per const Referenz übergeben, wenn du sie nicht verändern willst. Das gibt dir mitunter einen großen Vorteil, weil das Objekt nicht kopiert werden muss (=schneller).

Bei kleineren Typen int/float ist die Ersparnis sehr gering bzw. es gibt keine, da ist es dann relativ egal.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

09.05.2013, 07:16

Von welcher Sprache reden wir denn hier? Nicht dass Du am Ende sowas wie "void foobar ( ref foo )" in C# programmierst, das wäre nämlich Quatsch.

In C++ sind Referenzen natürlich durchaus eine sinnvolle Sache. Dort bitte dann aber auf const-correctness achten!

Im Falle des Bombermans wäre es wohl doch sehr von Nachteil, wenn Du Deine Spieler immer kopierst bei der Übergabe als Parameter. Angenommen Deine Haupt-Logik ist kein Spaghetti-Code, dann wird sie früher oder später mal einen Spieler oder etwas ähnliches an eine Funktion übergeben. Da eine Kopie anzulegen nützt dem Original Objekt ja ziemlich wenig. Daher: Referenz.

Wahlweise bei SFML eine Texture by Value zu übergeben, ist ebenfalls eine sehr blöde Idee, weil SFML tollerweise die Textur kopiert und sogar eine Kopie auf der Grafikkarte erzeugt. Ist natürlich toll, dass SFML das kann, aber wenn man nicht aufpasst, hat man so plötzlich ganz viel unnütze Daten erzeugt und müllt seinen Speicher gewaltig voll.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

09.05.2013, 09:47

"Ausschließlich" mit Referenzen zu arbeiten ist auf jeden Fall völliger Schwachsinn, eine der große Stärken von C++ gegenüber einigen anderen Sprachen liegt gerade darin, dass man es sich aussuchen kann...

De_Struktor

unregistriert

5

09.05.2013, 10:28

natürlich war es hochclever nicht anzugeben in welcher Sprache das geschehen soll. ---> XNA(C#) ^^

Und bei der funktion z.b:


C#-Quelltext

1
2
3
4
5
public void UpdatePlayer(ref Rectangle[] Red_block, ref Rectangle[] Tree_block)
        {
            Red_rect = Red_block;
            Tree_rect = Tree_block;
           // weitere Code...


Wäre das so in Ordnung, dann übergebe ich ja z.b direkt das Original des Rectangles auf dem gearbeitet wird und der Texture??!

ist das i.O

De_Struktor

unregistriert

6

09.05.2013, 10:31

Zitat


Von welcher Sprache reden wir denn hier? Nicht dass Du am Ende sowas wie "void foobar ( ref foo )" in C# programmierst, das wäre nämlich Quatsch.



Wieso wäre das quatsch.

Sry für Frage, nur bin da nich etwas unsicher...

7

09.05.2013, 10:52

Bezogen auf C++: Ein Prof von mir hat gemeint, er hätte mal getestet wann was schneller ist, die genauen Daten des Tests hat er nicht mehr gesagt.
Ergebnis: Alles über 64 byte per reference übergeben, alles darunter per value, sofern das semantisch egal ist für die programmlogik.
Mein Fazit: Grob drauf achten nicht zu viele Daten zu verschieben, einzelne Bytes zu zählen lohnt sich aber IMHO nicht (stichwort premature optimazation). Sowas verändert sich wenn ich was programmiere auch öfters mal, da bekommen iwelche structs noch was dazu oder etwas fällt weg beim entwickeln etc.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

09.05.2013, 11:29

Guck dir mal das hier an. Ich meine du hättest auch mal gesagt du arbeitest mit einem C# Buch. Da sollte auch was zu "ref" und "out" drin stehen. Guck dir das noch mal genauer an und wenn dann noch Fragen offen bleiben, kannst du ja hier im Thread nachfragen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

09.05.2013, 11:35

natürlich war es hochclever nicht anzugeben in welcher Sprache das geschehen soll. ---> XNA(C#) ^^

Und bei der funktion z.b:


C#-Quelltext

1
2
3
4
5
public void UpdatePlayer(ref Rectangle[] Red_block, ref Rectangle[] Tree_block)
        {
            Red_rect = Red_block;
            Tree_rect = Tree_block;
           // weitere Code...


Wäre das so in Ordnung, dann übergebe ich ja z.b direkt das Original des Rectangles auf dem gearbeitet wird und der Texture??!

ist das i.O

Genau wegen sowas habe ich gesagt man muss wissen welche Sprache. C# übergibt nahezu nichts by value - nur structs und andere integrale Typen. Daher macht das da NULL Sinn, außer du willst die Arrays per "new" komplett neu zuweisen. Also: Nein, Finger weg von "ref" in diesem Fall. Bei C# sind Referenz-Typen eben genau das: Referenz-Typen, die per Referenz übergeben werden - automatisch und immer! Das "ref" Schlüsselwort hat eine sehr sehr spezielle Bedeutung und sollte daher auch nur dann eingesetzt werden, wenn tatsächlich genau diese Funktionalität benötigt wird. Das ist hier aber nicht der Fall. Die Arrays werden auch ohne "ref" by reference übergeben und die Semantik von "ref" wäre hier schlicht falsch.

Wie dot zudem schon sagte: Bei C++ sollte man Wert darauf legen auch mal etwas by value zu übergeben.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

De_Struktor

unregistriert

10

09.05.2013, 12:20

Gut, ich danke euch wie immer.

Ich habe es verstanden, vielen Dank, war etwas ungewiss, wie damit zu arbeiten war und schorsch, ich habe es gelesen, nur das ist etwas knapp formuliert, wollte es etwas detalierter^^, aber vielen vielen dank :)
Achja und soll ich ich immer wenn ein Problem das in einem neuen Thread gelöst worden ist, hinter den Titel, z.b: [Gelöst]: Wann "Call by Value" wann "Call by Reference" schreiben ??

mfg

DeStruktor

Werbeanzeige