AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Heap und Stack - Unterschiede

Ein Thema von -187- · begonnen am 23. Aug 2011 · letzter Beitrag vom 27. Mai 2014
Antwort Antwort
Seite 1 von 2  1 2      
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#1

Heap und Stack - Unterschiede

  Alt 23. Aug 2011, 21:32
Moin, ich hab mal ne Frage bezüglich "Heap und Stack" !

Also was ist denn eigentlich der Heap und was ist der Stack ? Recherchen im Netz waren -für mich- widersprüchlich. Kann mir jemand in eigenen Worten erklären was der wesentliche Unterschied ist und welche Variablen vom Stack und welche vom Heap verwaltet werden ?

Danke schonmal für eure Antworten,

Ciao!
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Heap und Stack - Unterschiede

  Alt 23. Aug 2011, 21:42
Den Stack als Datenstruktur kannst du dir wie einen Stapel vorstellen.
Wenn du oben was draufgepackt hast (push) kannst du auch nur das oberste Element wieder runternehmen (pop) oder es dir anschauen (peek).

Der Stack als Speicherbereich ist in etwa so aufgebaut wie die gerade erwähnte Datenstruktur:
Mit den Assemblerbefehlen push und pop können Bytes draufgeschoben werden.
Entgegen der bildlichen Vorstellung eines Stapels wächst er jedoch nach unten.
Auf den Stack kommt alles, was verschachtelt wird:

> Funktion A wird aufgerufen mit Argument B
>> Return-Pointer kommt auf den Stapel
>> B kommt auf den Stapel
>> A macht was mit B
>> Funktion A wird rekursiv aufgerufen mit Argument C
>>> Return-Pointer kommt auf den Stapel
>>> C kommt auf den Stapel
>>> A macht was mit C
>>> Stapel wird bereinigt
>>> Return-Pointer wird gepopt
>> Stapel wird gereinigt
>> Return-Pointer wird gepopt
> und wir sind wieder im Hauptprogramm

Verstanden?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Heap und Stack - Unterschiede

  Alt 23. Aug 2011, 21:42
ich meine
http://de.wikipedia.org/wiki/Dynamischer_Speicher
liefert eine verständliche Erklärung
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von ehX
ehX

Registriert seit: 11. Aug 2011
Ort: Augsburg
55 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Heap und Stack - Unterschiede

  Alt 23. Aug 2011, 21:42
Der Heap ist der Speicher, den du für dynamische Speicherzuweisungen verwendest. Dieser hat so viel "Platz" wie dein System noch frei hat.
Der Stack hat dagegen einen feste Grösse und ist vieeel kleiner als der Heap, dafür aber wesentlich schneller und so aufgebaut wie ein LiFo-Puffer.
Im Stack werden lokale Variablen und generell alles, was temporär zur Laufzeit einer Routine (calls by value etc.) an Speicher benötigt wird, abgelegt.
Im Heap sind die Allokationen persistenter, d.h., jeglicher Speicher, den du anforderst (malloc und Konsorten) landet im Heap.
Fin
  Mit Zitat antworten Zitat
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#5

AW: Heap und Stack - Unterschiede

  Alt 23. Aug 2011, 21:56
Danke für eure Informationen. Dann kommen zum Beispiel Stringlisten (TStringList) auf den Heap weil die Größe ungewiss ist ?

//Edit: @implementation, tolle Erklärung, Dankeschön!
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Heap und Stack - Unterschiede

  Alt 23. Aug 2011, 22:07
wenn Dich das ganze wirklich interessiert, damm schau Dir mal ein paar Assemblercodeblöcke an, ich durfte damit groß werden, nativer siehst nirgends was wirklich passiert.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Heap und Stack - Unterschiede

  Alt 24. Aug 2011, 04:29
Dann kommen zum Beispiel Stringlisten (TStringList) auf den Heap ?
Ja

weil die Größe ungewiss ist ?
Nein, sondern, weil es angeforderter Speicherbereich ist.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#8

AW: Heap und Stack - Unterschiede

  Alt 24. Aug 2011, 05:56
Auf den Stack kommen vorallem lokale Variablen, Rücksprungadressen der Prozeduraufrufe und Stackframes.

Dynamische Arrays, "lange" Strings (also alles außer Delphi-Referenz durchsuchenShortStrings und statischen Char-Arrays), Objekte und Interfces sind intern Zeiger, also liegen dann maximal ihre Zeiger auf'm Stack und der Rest im Heap, da dessen Speicher intern z.B. über GetMem angefordert wird.

Globale Variablen und typisierte Konstanten liegen in der DataSektion der EXE/DLL.
"Echte" Konstanten landen meißt in der CodeSektion, bzw. werden ja direkt in den Nutzungsstellen wertmäßig eingebaut.
Felder/Membervariablen von Objekten, da dieses ja in dem Objekt liegen, landen somit auch auf dem Heap landen.


Deshalb bekommt man gerne mal Probleme (Stacküberlauf) bei:
- zirkulären Prozeduraufrufen / Endlosschleifen
- zu großen statischen Arrays
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (24. Aug 2011 um 08:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#9

AW: Heap und Stack - Unterschiede

  Alt 24. Aug 2011, 07:24
Auf den Heap kommen vorallem lokale Variablen, Rücksprungadressen der Prozeduraufrufe und Stackframes.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

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
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz