Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#11

AW: Heap und Stack - Unterschiede

  Alt 24. Aug 2011, 07:48
Auf den HeapStack kommen vorallem lokale Variablen, Rücksprungadressen der Prozeduraufrufe und Stackframes.
(Goreckdur (das Dicke) von mir)



Zitat von himitsu:
Globale Variablen liegen im Heap
Die liegen in der Data-Section vom Programm. Da hier kein (zusätzlicher) Speicher reserviert oder irgendetwas freigegebenen werden kann, würde ich dies nach der Definition von Heap nicht als Heap bezeichnen.
Deswegen:
  • globale Variablen -> Im Programmcode (Data-Section)
  • lokale Variablen -> Stack (ggf. auch nur im Prozessor/Register)
  • der ganze Rest an Speicher -> Heap
Ansonsten ist schon alles gesagt. Auf dem Stack landen neben den lokalen Variablen noch:
  • Übergabeparameter (wenn nicht im Prozessor/Register) an Funktionen
  • Rücksprungadressen
  • Exception-Frames (jedes mal wenn man try aufruft, biss das finally oder except kommt)
  • der Inhalt von Registern, der mal kurzfristig zwischengespeichert werden muss
Für den Stack hat die Intel-Architektur (nicht nur die) auch spzielle Befehle (push und pop) für deren Nutzung, oder Befehle, die den Stack gleich mal mitbenutzen (call, ret)


Im Grunde genommen passiert bei der Programmausführung folgendes:
Die EXE (inkl. aller benötigten, statisch eingebundenen DLLs) wird in den Speicher geladen. Damit sind schon mal alle globalen Variablen (die ja mit ihrem Initialisierungswert schon in der EXE direkt drin stehen) im Speicher. Bei den globalen Variablen kannst du deswegen zwar jederzeit deren Inhalt ändern, aber nie deren Speicherplatz freigeben.
Die nächste spannende Speicheraktion kommt, wenn dein Programm (im Mainthread) gestartet wird. Dann bekommst du (bei Standardeinstellung) 16kB Speicher reserviert. Im Prozessoer gibt es dafür dann ein Register (kleiner Speicherplatz) namens ESP, der dir zeigt wo der Stack liegt und der auch von solchen Befehlen wie push, pop, call und ret enstsprechend genutzt wird. Darauf landen, wie gesagt, die lokalen Variablen und diverses schon Genanntes.
Und was jetzt noch (von den 2GB virtuellem Adressraum) übrig ist, nennt sich Heap, auf dem du dich austopben kannst. Das heißt, du kannst jederzeit von Windows Speicher anfordern (was u.a. getmem für dich erledigt, welches auch von jedem Constructor TKlasse.Create genutzt wird) und den frei für Daten nutzen und jederzeit asuch wieder an Windows zurückgeben.

Soweit von mir...
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat