Unterschied zwischen Heap and Stack?

Persönliche Seite #2391829
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
Gast #2391830
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.
Gast #2391832
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.
#2391870
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.
Gast #2396324
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren