Forum: PC-Programmierung Unklarheiten "Normales" RAM / Heap / Stack


von Richi (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Richi (Gast)


Lesenswert?

>   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")

von (prx) A. K. (prx)


Lesenswert?

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.

von Richi (Gast)


Lesenswert?

Bzw, könnte man es so sehen:

RAMSTART |Global ->        |Heap ->             |   <- Stack| RAMEND

von (prx) A. K. (prx)


Lesenswert?

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.

von Richi (Gast)


Lesenswert?

Na dann besten Dank für deine Hilfe!
Lg,
R.

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
Noch kein Account? Hier anmelden.