Guten Abend Forum, ich hätte da ein paar Fragen zu Heap / Stack und zu dem was öfters gerne als "normales RAM" bezeichnet wird. Sprache: C / C++ Allgemein heißt es ja: * Rücksprungadressen und lokal (in den Methoden / Funktionen) verwendete Variablen landen auf dem Stack, * Größere Datenmengen (z.B. fette Arrays oder Objekte) sollen mittels malloc / new auf den Heap gelegt werden. * Liest man auch immer: Globale Variablen landen im "normalen RAM" Meine Fragen: Ist mit dem normalem RAM der Heap gemeint und das Programm allkokiert dort bei Programmstart fix den global benötigten Speicher? - Das nehme ich so an Wenn ich ein Objekt dynamisch allokiere, landen dann seine Members (auch die Statischen) auch auf dem Heap? - Das nehme ich NICHT so an, aber ich kann mir nicht erklären wie ein dynmisches Objekt einen Statischen Teil im Stack haben kann. Umgekehrt würde es mir einleuchten. Thx, Richi
Richi schrieb: > * Größere Datenmengen (z.B. fette Arrays oder Objekte) sollen mittels > malloc / new auf den Heap gelegt werden. Weshalb? Der Heap ist für Daten, die nicht permanent benötigt werden, oder die keine vordefinierte Grösse besitzen. Aber statisch oder global dürfen sie ebenso sein. Nur der Stack ist für wirklich grosse Daten u.U. zu klein vorgegeben. Objekte können überall liegen, lokal (Stack), global, statisch, Heap. > Ist mit dem normalem RAM der Heap gemeint und das Programm allkokiert > dort bei Programmstart fix den global benötigten Speicher? Nein. Der Lader des Betriebssystems macht das, ebenso die Initialisierung statischer und globaler Daten. Die Adresszuweisung globaler und statischer Daten wird bereits durch den Linker vorgenommen. Es gibt zudem bei PCs kein normales und unnormales RAM. > Wenn ich ein Objekt dynamisch allokiere, landen dann seine Members (auch > die Statischen) auch auf dem Heap? Die statischen nicht. Deshalb ja statisch, der Heap ist dynamisch.
> Ist mit dem normalem RAM der Heap gemeint und das Programm allkokiert > dort bei Programmstart fix den global benötigten Speicher? > Nein. Der Lader des Betriebssystems tut das. > Es gibt zudem bei PCs kein normales und unnormales RAM. Landen der Inhalt von char x[10000]; und x = new char[10000]; im selben Speicher? Wenn nicht wo liegt der Unterschied im Speicher (bitte jetzt nicht sagen "new is dynamisch")
Richi schrieb: > im selben Speicher? Definitionssache. Es gibt formal nur eine Sorte RAM, also insofern ja. Aber der Heap wird oft dort beginnen, wo die statischen und globalen Daten aufhören, also insofern nein.
Bzw, könnte man es so sehen: RAMSTART |Global -> |Heap -> | <- Stack| RAMEND
Grob vereinfacht ja, wobei der Pfeil bei den globalen Daten irreführend ist, denn die wachsen nicht an. Bei AVRs mit GCC ist das genau so. Aber da wir hier von PCs reden hast du den Code vergessen. Der liegt auch im RAM. Davor, dazwischen und dahinter werden möglicherweise Löcher im Adressraum sein, denen kein RAM zugewiesen ist, die Reihenfolge kann anders sein und es kann mehrere Stack geben. Sowas entscheidet auch das Entwicklungssytem, das ist nicht exakt vorgegeben. Auch DLLs verkomplizieren die Sache.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.