Forum: Mikrocontroller und Digitale Elektronik Unterschied zwischen Heap and Stack?


von Joi (Gast)


Lesenswert?

Hallo,
kann mir mal jemand ganz simpel erklären was der Unterschied zwischen 
Heap and Stack ist? Habe im Netz nachgelesen, es aber immer noch nicht 
so ganz verstanden.
Vielen Dank.
Mfg

von André A. (nummer5) Benutzerseite


Lesenswert?

Heap ist der Speicherbereich, der von malloc genutzt wird und Stack der 
Speicherbereich, der von lokalen Variablen genutzt wird.
Wobei der Stack keine Maximalgröße hat, deshalb kann es bei zu wenig 
reservierten Stack zum überschreiben von anderen Speicherbereichen 
kommen.
Die Größe des Heaps wird meine ich beim linken (ich glaub im 
Linkerscript) festgelegt und wenn der Heap zu Laufzeit voll ist bekommt 
man von malloc einfach einen Null-Zeiger zurück.

Hier steht auch ein Bisschen:
http://www.rn-wissen.de/index.php/Speicherverbrauch_bestimmen_mit_avr-gcc

von Krapao (Gast)


Lesenswert?

Stack ist der Bereich im RAM-Speicher auf den z.B. lokale Variablen 
und Rücksprungsadressen gespeichert werden.

Heap ist der Bereich im RAM-Speicher von dem Libraryfunktionen z.b: 
malloc() Speicherbereich für Daten anfordern und zurückgeben (free()) 
können.

Oft ist der Heap oberhalb der max. Größe des Stacks angelegt; das ist 
aber nicht zwingend. Die max. Größe des Stacks und des Heaps werden 
meistens in den Einstellungen der Toolchain angegeben. Bei C-Projekten 
z.B. in Linkercontrolfiles; bei BASCOM-Projekten z.B. am Programmanfang 
mit best. Schlüsselworten.

von Martin (Gast)


Lesenswert?

Stack packt der Prozessor "selbstständig" Daten hin, z.B. bei einem 
Spung in eine Unterroutine oder bei einer Interruptserviceroutine werden 
dort die Register zwischengespeichert und die Adresse an der das 
Programm vortgesetzt wird wenn die Unterroutine beendet wird. Normal ist 
dies ein LIFO.
http://de.wikipedia.org/wiki/Last_In_%E2%80%93_First_Out

Der Heap ist für die dynamische Speicherverwaltung. Du kannst eine 
bestimmte Menge Speicher bei einer Bibliotek anfordern, damit arbeiten 
und dann wieder freigeben. Die Bibliotek verwaltet dabei den 
Speicherbereich. Die Bibliotek sucht dir die Adresse an der genug Platz 
ist.

von (prx) A. K. (prx)


Lesenswert?

Krapao schrieb:

> Oft ist der Heap oberhalb der max. Größe des Stacks angelegt; das ist
> aber nicht zwingend. Die max. Größe des Stacks und des Heaps werden
> meistens in den Einstellungen der Toolchain angegeben.

Wie die Grössen von Heap und Stack definiert sind ist derart abhängig 
von der Umgebung in der man programmiert, dass man keine globale Aussage 
darüber treffen kann. So kann es bei Mikrocontrollern sein, dass die 
Grösse eines oder mehrerer Stacks in der Toolchain festgelegt werden 
muss, es kann aber auch sein, dass der Heap und ein Stack im verfügbaren 
Speicher gegeneinander laufen und somit ohne explizite Festlegung als 
Summe beider begrenzt sind.

von Joi (Gast)


Lesenswert?

Und wo landen zum Beispiel globale Variablen?

von (prx) A. K. (prx)


Lesenswert?

Völlig andere Baustelle. An einer vom Linker festgelegten Adresse im 
RAM. Weder im Stack noch im Heap.

von Joi (Gast)


Lesenswert?

Also muss ich mir das so vorstellen:


Mein RAM:
|----HEAP---|----STACK-----|----globale Var.---|

??

von Olaf (Gast)


Lesenswert?

> Also muss ich mir das so vorstellen:

Der Compiler legt seine Daten, in bestimmten Sections ab. Wo die dann 
genau liegen entscheidet spaeter der Linker. Das kann so aussehen wie 
auf deinem Bild, die Reihenfolge kann aber auch ganz anders sein. Und du 
kannst auch selber auf Groesse und Position Einfluss nehmen.
Es kann auch sein das es garkeinen Heap gibt.
Ausserdem unterscheidet der Compiler noch zwischen Variablen die mit 0 
initialisert werden, und solche die einen Startwert haben. Und dann noch 
Variablen die Constanten sind, also eigentlich keine Variablen.

Aber so im Prinzip hast du es jetzt verstanden. :-)

Olaf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.