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

TigerClaw25

unregistriert

1

08.07.2017, 18:50

Call-by-Value und Call-by-Reference

Hallo Zusammen,
ich habe wieder einmal eine Frage und zwar folgendes:

Call-by-Value bei der Parameterübergabe:
Im Prinzip werden bei der Übergabe von Parametern an Funktionen Kopien erstellt. Ein Nachteil ist, dass nur ein Wert zurückgegeben werden kann. Das zweite Problem dürftre wohl sein, dass z.B. bei der Übergabe von ganzen Strukturen als Parameter der Stack zusätzlich "belastet" wird.

Call-by-Reference
Bei dieser Parameterübergabe wird nur die Adresse der Variablen als Argument zu übergeben. Das heißt, mein Zeiger als Parameter der Funktion bekommt durch einen Funktionsaufruf foo(int &radius) eben die Adresse der Variablen "radius" zugewiesen. Aber wie genau? Wird diese Adresse wie bei "Call by Value" auf dem Stack kopiert bzw. eine Kopie erstellt? Falls ja, nimmt diese Kopie genau so viel Speicher ein wie eine Variable? Es ist ja im Prinzip nur eine Adresse. Andererseits, wenn es eine Kopie ist, wie greift dann der Zeiger direkt auf den Wert zu. Ich bin verwirrt, was genau passiert ...

Und wie sieht es dann bei der Übergabe von Strukturen als Parameter einer Funktion aus? Werden dann alle Adressen der Strukturelemente übergeben? Würde das dann nicht genau so den Stack belasten?
Aber so viel ich verstanden habe, zeigt ein Zeiger immer nur auf die Anfangsadresse. Also gehe ich momentan davon aus, dass durch den Aufruf foo(&structurxyz) nur die Anfangsadresse übergeben wird oder? Also spare ich dann auch Speicherplatz bei großen Objekten ...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (08.07.2017, 18:55)


TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

2

08.07.2017, 18:54

Auf dem Stack liegt immer der Zeiger der aufs erste Byte der Daten zeigt. Durch den Datentyp ergibt sich dann erst, wieder Speicher an dieser Adresse aufgebaut sein soll. Die Adresse der einzelnen Strukturmember kann immer aus den Offsets der einzelnen Member zueinander berechnet werden, diese zu übergeben wäre daher Speicher und Zeitverschwendung.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

08.07.2017, 19:18

Aber wie genau? Wird diese Adresse wie bei "Call by Value" auf dem Stack kopiert bzw. eine Kopie erstellt? Falls ja, nimmt diese Kopie genau so viel Speicher ein wie eine Variable?
Eine Adresse ist erstmal nur ein virtuelles Konzept. Es steht schließlich an keinem Byte dran "das hier ist Adresse 123213". Dennoch ist für die CPU jeder Speicher mit einer Adresse verbunden. Übergibt man nun eine Variable als Referenz, dann weiß die CPU (bzw. das Programm) wo im Speicher die Variable liegt und schreibt diese Adresse in eine Pointer-Variable im Stack. Stell dir das vor wie Schubfächer im Regal. Da steht ja auch nicht dran "Fach 1", "Fach 2", etc. Trotzdem kannst du jemandem sagen: "Im zweiten von oben". Ein Pointer ist immer gleich groß, egal auf was er zeigt. Das heißt im Fall von 32-Bit-CPUs 4 Byte und im Falle von 64-Bit-CPUs 8 Byte. Der Datentyp wird also keineswegs kopiert. Nur die Adresse wird in den Stack geschrieben.
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]

TigerClaw25

unregistriert

4

08.07.2017, 20:25

Im Falle einer Struktur per Call by reference jedoch nur eine Adresse, da der Zeiger eben auf die Anfangsadresse zeigt, oder? Das heißt, der einzige Ort wo ich Speicherplatz benötige ist dort, wo ich z.B. mit new Speicher reserviere und ein Wert stehen wird. Die Adresse wird dann nicht kopiert, sondern direkt an den zeiger übergeben, wobei es sich dabei immer um die Anfangsadresse handelt oder?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

09.07.2017, 07:20

Ja. Aber häng dich nicht so am Wort 'kopiert' auf. Das benutzt man häufig nicht nur im Sinne von "dupliziert", sondern eben auch im Sinne von "hineinschreiben".
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]

Werbeanzeige