Hallo patrick,
In welcher Beziehung steht der Heap zum Stack?
Eigentlich in gar keiner
D.h. der Heap
ist nicht wie der Stack aufgebaut, sondern man kann zur
Laufzeit auf alle Speicherstellen drauf zugreifen…
Nicht ganz so !!
Du darfst nur auf diese Speicherstellen zugreifen, welche dir auf Anfrage hin zugeteilt wurden.
Wie er genau aufgeteilt ist und verwaltet wird, hängt vom Betriebssystem ab.
Die Grundfunctionen sind malloc() und free().
new und delete greifen auf diese Functionen zurück.
und es
wird zur Laufzeit immer nachgeschaut wo noch freie stellen im
Speicher sind. Der Stack wird ja von Ende des Speichers nach
vorne belegt… und der Heap befindet sich somit im vorderen
bereich des speichers… ok
Das hängt wiederum von der CPU ab. Es gibt, bzw. gab, auch CPUs bei denen der Stack in die andere Richtung wächst.
D.h. auch wenn im Constructor nichts drinnen steht, weiß er
wieviel speicher zu reservieren ist?
Ja
Hmm und das Wort Objekt
muss ich für mich noch irgendwie definieren; bis jetzt kann
ich mir darunter noch nichts genaues vorstellen.
Bei der alten klassischen Programmierung mit z.B. Spaghetti-BASIC gab es nur globale Variablen, d.h. jede aus jeder Codezeile im ganzen Programm konnte immer auf alle Variablen zugegriffen werden. Unterprogramme musste mit GOSUB aufgerufen werden und die Variablennamen waren auf maximal 2 Zeichen begrenzt.
Da hat dann schon einmal ein Unterprogramm die falsche Variable verändert …
Typischer Fall:
Du hast eine FOR NEXT Schleife, welche I als Index-Variable verwendet. Aus dieser Schleife ruftst du ein Unterprogramm auf, welches auch eine Schleife enthält, welche I verwendet … Tja, dann ging die Sucherei nach dem Bug los …
Mit den Prozeduralen Sprachen, kamen dann lokale Variablen hinzu.
Du kannst also in jeder Funktion I als Index-Variable verwenden und diese sind voneinander getrennt, wen sie lokal definiert sind.
Desweiteren kannst du eigene Datentypen definieren. Du kannst also einzelne Variablen welche logisch zusammengehören auch programmtechnisch zu einem Dings … also Objekt … zusammenfassen.
Bei OO geht man einfach noch einen Schritt weiter.
Zu dem Daten-Konstrukt, packt man einfach auch noch alle Funktionen welche es bearbeiten sollen hinzu. Desweiteren kann man dann auch noch angeben welche Elemente nach aussen hin sichbar sind. Die Daten werden also gekapselt.
Zur Übersetzungszeit sind aber nur die Struktur der Daten und die Funktionen bekannt.
Zur Laufzeit muss dann für jedes Objekt erst noch der Speicher für die Variablen und der Verweis auf die darauf anwendbaren Funktionen erstellt werden, was „new“ übernimmt.
Wieviel
speicher muss ich für welches Objekt investieren?
Das hängt von deinem Objekt, dem Compiler und der CPU ab.
MfG Peter(TOO)