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
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
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.
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.
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.
Völlig andere Baustelle. An einer vom Linker festgelegten Adresse im RAM. Weder im Stack noch im Heap.
Also muss ich mir das so vorstellen: Mein RAM: |----HEAP---|----STACK-----|----globale Var.---| ??
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.