![]() |
AW: Heap und Stack - Unterschiede
Zitat:
Zitat:
Deswegen:
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... |
AW: Heap und Stack - Unterschiede
Zitat:
|
AW: Heap und Stack - Unterschiede
korrigiert :oops:
|
AW: Heap und Stack - Unterschiede
Alles klar, Dankeschön an alle !:)
|
AW: Heap und Stack - Unterschiede
Sodele ich betätige mich mal als Leichenschänder.
Seit ihr euch sicher das Lokale Variablen im Stack landen? Wenn ich eine Lokale Variable ändern will, muss ja dann der ganz stack bis zur Variable hinauf geppopt werden, die Variable geändert und anschließend schön brav wieder alles zurück pushen. Vor allem woher weiß die CPU den noch an welcher stelle im Stack die Variable beerdigt liegt. Vielleicht ist aber mit lokaler Variable was anderes gemeint, als ich meine.
Code:
procedure TForm1.Button1Click(Sender: TObject);
var lokale : integer; variable : String; begin end; PS: Warum wird eigentlich String Fett abgebildet und Integer als Normalschrift? |
AW: Heap und Stack - Unterschiede
Ja, sind wir.
Die lokalen Variablen, Rücksprungungadressen usw. werden auf den Stack gepusht und beim Verlassen der Prozeduren wieder gepoppt. Aber der Zugriff auf die darauf befindlichen Inhalte geht direkt, über die relative Adresse zum aktuellen Stackpointer. Im Prinzip hat dieser Stack meistens eine feste Größe (MinStackSize bis MaxStackSize) und es gibt nur einen/zwei Stack-Pointer (ESP und EBP), für die aktuelle Position im Speicher ... an der Stelle werden neue Werte draufgepusht und dabei der Pointer verschoben. [add] String ist ein "Reservierter Bezeichner" ![]() ![]() |
AW: Heap und Stack - Unterschiede
Der Stack passt doch perfekt. Beim Aufruf werden die Parameter und dann die lokalen Variablen auf den Stack gelegt
Code:
Innerhalb der Prozedur weiß der Rechner, dass sich
variable : string
lokale : integer Sender : TObject Rücksprung-Adresse ...
Delphi-Quellcode:
an der Stelle Stack-1 und
lokale
Delphi-Quellcode:
an Stack-0 befindet.
variable
Wird diese Prozedur jetzt erneut aufgerufen, dann
Code:
passt das doch wie die Faust aufs Auge ;)
variable : string
lokale : integer Sender : TObject Rücksprung-Adresse variable : string lokale : integer Sender : TObject Rücksprung-Adresse ... |
AW: Heap und Stack - Unterschiede
Ok stimmt, man kann den Stack ja auch per Pointer und MOV.. beschreiben und lesen.
Hierdurch wird der Stackpointer nicht Inc/Dec. Push und Pop hilft verändert ja bequemer weiße den SP mit. Ok ich glaub ich habs jetzt auch *g* PPS: Und warum ist Integer kein Reserviertes Wort. Das interessiert mich schon seit Jahren. |
AW: Heap und Stack - Unterschiede
Das wiederum wäre ein neues Thema!
Gruß K-H |
AW: Heap und Stack - Unterschiede
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:13 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