Laden...

Heap und Stack?

Erstellt von math55 vor 15 Jahren Letzter Beitrag vor 15 Jahren 5.607 Views
math55 Themenstarter:in
314 Beiträge seit 2007
vor 15 Jahren
Heap und Stack?

Hallo,

ich habe eine Frage bezüglich Heap und Stack. Klassen werden ja auf dem Heap gespeichert und jede neue Instanz der Klasse verweist auf die gleiche Stelle im Heap. Hingegen Werttypen und structs etc landen ja im Stack und belegen da soviel Platz, wie sie eben belegen. Das ist erstmal klar. Jetzt die Fragen:

  1. Was passiert, wenn ich in einer Instanz einer Klasse Werte setze, landen die dann auf dem Stack?

  2. Der Heap ist ja ein Teil aus dem Arbeitsspeicher, was ist dann aber der Stack?

Das wars schon, vielen Dank 😃.

Grüße

C
401 Beiträge seit 2007
vor 15 Jahren

Also... Ein Stack kannst du dir wie eine Kiste vorstellen. Du legst ein paar Sachen rein und holst sie in genau der umgekehrten Reihenfolge wieder raus. Das ganze nennt man push (reinlegen) und pop (rausholen).

Bsp.:


push(obj1);
push(obj2);
push(obj3);
pop(); // >> obj3
pop(); // >> obj2
pop(); // >> obj1

Ein Heap ist eher wie ein Regal. Du legst etwas da hin, wo gerade Platz ist und kannst genau diese Sache auch wieder gezielt entnehmen. Der Heap ist der dynamische Speicher.

edit:

zu deinen Fragen^^

1.) Alsooo... Nicht die Klassen werden im Heap gespeichert, sondern die Instanzen und jede Referenz zeigt auf den gleichen Bereich im Heap. Jedes neue Objekt, egal ob es vom gleichen Typ ist bekommt natürlich auch einen neuen Bereich im Heap. Wenn du z.B. einen Wert eines Objektes änderst wird der in diesem Bereich verändert und sonst nirgendwo.

2.) Also prinzipiell werden ja alle Daten, die ein Programm benutzt im Speicher abgelegt. Deswegen ist der Stack natürlich auch im Arbeitsspeicher.

2.187 Beiträge seit 2005
vor 15 Jahren

Hallo math55,

Ich lege zwar nicht meine Hand dafür in's Feuer aber:
zu 1. Instanz-Variablen eines Refernztypen landen meines wissens nach mit diesem auf dem Heap.
zu 2. Der Stack befindet sich nach möglichkeiten im Register (speicher in der CPU) oder in den Cach-Speichern (L1, L2, ...). Sollte der Platz nicht reichen geht's in den Arbeitsspeicher.

Gruß
Juy Juka

C
401 Beiträge seit 2007
vor 15 Jahren

Also im Cache werden ja nur die Daten gelagert, auf die häufig zugegriffen wird, deswegen ist es ja fraglich, ob immer alle Daten aus dem Stack im Cache gehalten werden. Aber es wird sich ja hoffentlich noch jemand zu Wort melden, der uns hier noch erleuchten kann.^^

U
208 Beiträge seit 2008
vor 15 Jahren

Also ich hab das auch so gelernt, dass der Stack, genauso wie der Heap, im Arbeitsspeicher liegt. Aber im Grunde beschreiben Stack und Heap ja nur, wie die Daten gespeichert werden und wie auf diese zugegriffen wird. Also ist es erstmal unabhängig vom Speicherort.

1.346 Beiträge seit 2008
vor 15 Jahren

Also im Cache werden ja nur die Daten gelagert, auf die häufig zugegriffen wird, deswegen ist es ja fraglich, ob immer alle Daten aus dem Stack im Cache gehalten werden. Aber es wird sich ja hoffentlich noch jemand zu Wort melden, der uns hier noch erleuchten kann.^^

Ein laufendes Programm braucht doch im normalfall seine Variablen. Also werden diese auch im Cache gespeichert.

Gruß pdelvo

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo math55,

Klassen werden ja auf dem Heap gespeichert und jede neue Instanz der Klasse verweist auf die gleiche Stelle im Heap. Hingegen Werttypen und structs etc landen ja im Stack ...

das ist, wie schon Corpsegrinder schrieb, nicht richtig. Für jede Instanz eines Referenztyps gibt es einen neuen Speicherplatz im Heap. So wie jede Instanz eines Werttyps auf dem Stack landet, aber natürlich nur dann, wenn es sich um lokale Variablen handelt. Enthält ein Objekt eines Referenztyps ein Field eines Werttyps, so liegt das Field natürlich auch auf dem Heap.

herbivore

T
574 Beiträge seit 2008
vor 15 Jahren
  
push(obj1);  
push(obj2);  
push(obj3);  
pop(); // >> obj3  
pop(); // >> obj2  
pop(); // >> obj1  
  

.. hach, da kommen Erinnerungen an assembler hoch ... da musste man noch wissen was man grade in welchem register gepushed hatte und von wo man "poppen" musste 😃

3.971 Beiträge seit 2006
vor 15 Jahren

wenn du in einem Werttyp ein Referenzfeld hast, ist der Zeiger auf den Ref.Typ auf dem Stack, die Instanz allerdings auf dem Heap.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

S
8.746 Beiträge seit 2005
vor 15 Jahren

Der Stack ist ganz normaler Arbeitsspeicher. Wird ein Thread anlegegt, wird ein Block zusammenhängender Speicher allokiert, der dazu dient lokale Variablen zu speichern, die Parameter an ein anzurufenden Funktion zu übergeben und Rückgabewerte der Funktion zurückzugeben (ja, es gibt Registeroptimierungen...).

Der Stack hat den Vorteil einer sehr einfachen Verwaltung. Das Push-Pop-Prinzip ist sehr schnell, direkt durch Assembler-Operationen unterstützt. Probleme wie Degframentierung gibt es nicht. Dieses Verhalten ist der Grund, warum man manchmal Structs und keine Klassen benutzt.