Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
eine allgemeine Frage zum Stack:
es ist ja so, dass z.B. lokale Variablen im Hauptspeicher auf den Stack gespeichert werden. Bei einem Stack kann ja aber immer nur auf das Element, das ganz oben drauf liegt zugegriffen werden. Wie kann es also sein, dass ich, wenn ich 2 Variablen erstelle, auf die zugreifen kann, die ich als erstes erstellt hab? Müsste ich nicht zuerst die zuletzt erstellte Variable entfernen?
Die Variablen werden auf dem Stack erzeugt und haben damit natürlich eine Adresse im Speicher wie jede andere Variable auch. Über diese Adresse kann dann auch immer direkt auf die Variable zugegriffen werden.
Der Speicher für diese Variable ist aber eben nur solange im Stack reserviert bis der augenblickliche Scope verlassen wird.
Mal so zur Veranschaulichung:
Du rufst eine Methode A() auf. Diese hat die Variable x und y. Nun wird auf dem Stack zunächst abgespeichert von wo diese Methode aufgerufen wird (Die Rücksprung-Adresse wo es hin geht wenn die Methode A beendet wird). Dann wird Platz für die beiden Variablen x und y geschaffen. Der Stack sieht dann also so aus
y(a) - y in A
x(A) - x in A
return(A) - Rücksprungadresse
Sagen wir einfach mal du hast jetzt 3 Einheiten von Speicher des Stack verbraucht.
Nun ruft Methode A bevor sie fertig ist die Methode B auf, die die Variablen i und j hat. Der Stack sieht dann so aus:
j(B)
i(B)
return(B)
y(a) - y in A
x(A) - x in A
return(A) - Rücksprungadresse
Wenn nun Methode B fertig ist, dann räumt sie den Stack ab bis zu der Rücksprung Adresse. Der Speicher für die Variablen i und j wird also freigegeben. Das klärt auch, warum lokale Variablen immer nur innerhalb Ihres Scopes gültig sein können. Der Stack sieht bei der Rückkehr zu Methode A also wieder so aus:
y(a) - y in A
x(A) - x in A
return(A) - Rücksprungadresse
Wenn nun A auch noch zurück kehrt, ist der Stack wieder genauso als wäre nie was passiert.
Aber wieso wird das dann so als Stapel realisiert? Beim Heap, wo die Objekte angelegt werden, ist das doch auch nicht so? Könnte man lokale Variablen und Rücksprungadressen nicht auch theoretisch in einem Heap realisieren, ohne Stapelung?
Klar kann man das aber das macht es ja nur unnötig kompliziert. So kann man alles mit einem mal abräumen. Sobald die Methode ein return findet (Und die kann ja beliebig viele haben) wird einfach der Stack bis zur Rücksprungadresse weggeräumt und fertig. Wären die ganzen Daten im Heap verteilt bräuchtest Du noch eine Memory-Tabelle wo steht welche Variable wo im Speicher steht und must dann alles einzeln wieder frei geben. Das ist dann auch wieder nichts anderes als ein verkappter Stack.
Ausserdem ist der Stack bereit angeforderter Speicher. Den kann ich einfach nutzen. Das geht schnell und effektiv. Würde ich den Speicher im Heap nehmen, müßte ich für jede Variable einen malloc() machen und das kostet Zeit und damit performance.