Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

Was sind Stack und Heap?





Frage

Hi! Vielleicht ne dumme Frage, aber was sind Stack und Heap? muss ich die extra festlegen? wäre ganz nett, wenn mir das jemand erklären könnte. cu JiNX

Antwort 1 von aths

Stack ist der Keller, Heap die Halde. Im Stack werden Variablen nach dem LIFO-Verfahren gespeichert. Der Heap ist eine Speicherbereich für dynamische Objekte und kann leider nicht so einfach verwaltet werden.

Antwort 2 von JiNX

muss man das überhaupt selber festlegen? habe etwas mit pascal rumexperimentiert und wollte eine .exe datei aus meinem programm aufrufen. ohen das festlegen geht es nicht, nur wenn ich den stack auf z.B. 1024 stelle.
was bedeutet das?
danke für antworten


Antwort 3 von Chonhulio

Wenn du Stack und Heap nicht begrenzt, belegt dein Programm den ganzen verfügbaren DOS-Speicher (640 kB). Daher verfügt das zweite Programm über keinen freien Speicher und kann nicht gestartet werden.

Antwort 4 von JiNX

Achso, danke. Was sind denn so gute Werte für den Stack und den Heap?

Antwort 5 von hansl

keine ahnung, musste mal die profis fragen!

Antwort 6 von mikele

ich habe sehr viel mit pascal rumprobiert, macht echt spaß, ich habe auch noch irgendwo units mit sowas drin die ich mal geschrieben habe.
mail mir mal, vielleicht kann ich dir dann mehr sagen, falls ich das wiederfinden sollte.

mikele

Antwort 7 von JiNX

kannst ja mal nachsehen...

Antwort 8 von k2-fly

Der STack ist der Arbeitsspeicher, also die 640 KB, mittels dieser EInstellung kannst du begrenzen wieviel Speicher dein Tool bekommt.

Der Heap ist der Hauptspeicher also das Ram, hier kannst du ebenfalls begrenzen.

Interessant ist das allerdings nur wenn du unter Pacal mit Pointer arbeitest, also Variablen, die im Stack stehen in den Heap verfrachtest und dann nur noch einen Zeiger drauf setzt.
Braucht man aber nur bei größeren Programmen, wenn die 640 KB kanpp werden.(grosse 2D Arrays usw)

Antwort 9 von asok

Heap und Stack sind, wie aths bereits sagte, grundsätzlich erst einmal zwei Formen der Speicherorganisation. Offenbar zielt die Frage aber auf Pascal für DOS ab, also auf die Einstellungen die man bei Borland per {$M...} (?) festlegen kann. Da verhält sich die Sache so:

Der Stackspeicher wird (vom Compiler!) benutzt für
- Rücksprungadressen von Funktionen
- Argumente (Parameter) von Funktionen
- lokale Variablen

Das kannst du testen indem du eine Funktion oder Prozedur implementierst, die sich selbst endlos oft aufruft. Du wirst feststellen, dass die Anzahl der Aufrufe bis zum Stacküberlauf unmittelbar von deiner {$M...}-Einstellung abhängt.

640KB für Stackspeicher wäre immens viel. Ein realistischer Wert ist z.B.
256 Bytes.

Während Stackspeicher vor dem Kompilieren festgelegt wird, kann Heapspeicher zur Laufzeit vom Betriebssystem angefordert und freigegeben werden. Wenn ich mich recht erinnere heissen die Pascal-Funktionen
NEW und DISPOSE.

Die Werte, die du für Stack und Heap einstellst werden dann in die EXE-Datei kodiert und vom Betriebssystem beim Laden ausgewertet.

k2-flys Aussage "Stack = Arbeitsspeicher" stimmt also so nicht.

Die Begrenzung für globale statische Variablen in DosPascal liegt auch bei 64KB, nicht 640Kb. Diese werden dann auch nicht im Stack gespeichert, sondern im Heap. Nix für ungut. :-)




Antwort 10 von k2-fly

Hab ja auch gesagt, das der Heap, nicht der Stack, der Arbeitsspeicher ist, das ist aber wirklich so.

Hab mich falsch ausgedrückt, eine Variable wird im Hauptspeicher(der der maximal 640KB haben kann) erzeugt. Mittels Pointern kann ich diese variable dann in den Heap(Arbeitsspeicher(Standert 128 MB)) verfrachten, somit habe ich im Hauptspeicher nur einen Verweis in den Arbeitsspeicher.

hab mich beim Stack aber vertan, wie aths schreibt lifo = last in first out
Wie ein Stapel Papiere, das was ich an infos als letztes raufgeleget(gepusht) habe wird als erstes heruntergeholt(gepopt)

Der Stack hat hohe relevanz bei der assemblerprogrammierung, unter Pascal habe ich mit dem Stack nicht viel zu tun gehabt, ausser Mouse-Cursor ein und aus zu schalten.

Antwort 11 von asok

k2-fly, ich will ja nicht kleinlich sein, aber du vertust dich da ein wenig.
In Pascal unter DOS ist der verfügbare Arbeitsspeicher auf ein Segment, d.h 64KB beschränkt. Mit Pointern kannst du den übrigen Speicher bis zur 640KB Grenze adressieren. Um den Speicher jenseits davon zu nutzen, ist richtig Aufwand notwendig. Da musst du per Hand Bereiche aus dem XMS/EMS-Speicher pagen. Das passiert nicht automatisch mit NEW.
Die Speicherbereiche, die dir zur Verfügung stehen sind also nicht 640KB normal -> max. RAM mit Pointern, sondern 64KB normal -> 640KB mit Pointern.
Ich beziehe mich allerdings bei alledem auf MS-DOS bis Version 6.
Unter Windows (MSDOS-Modus) kann das schon ganz anders aussehen. Das DOS-Programm bekommt dort Speicher von Windows zugewiesen, und ich glaube gern,
dass du da auch Bereiche jenseits der 640KB ganz normal belegen kannst.
Falls du ein echtes DOS-System hast, kannst du das ausprobieren. Versuch mal, mit dynamischen Variablen 4MB oder so zu belegen. Das wird nicht funktionieren, denke ich. Ich versuche dasselbe mal, wenn Pascal als DOS-Anwendung unter Windows läuft.
So long...

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: