globale variablen - heap oder stack oder ganz wo anders?
-
Hallo!
Hab mich letztens mit nem Kumpel gezankt
wo denn globale variablen im speicher liegen. Ich hab gesgat im Stack, er sagte auf dem Heap. Aber wo ligen sie denn nu wirklich?
-
Weder noch
auf dem Stack landen die lokalen Variablen (alles was du in einer Funktion deklarierst), auf dem Heap landet alles, was du dynamisch (mittels new oder malloc) reservierst. Globale Variablen haben ihren eigenen Speicherbereich - leider fällt mir auf Anhieb der Name davon nicht ein.
-
ich hab mir globale variablen vorgestellt als lokale variablen, die erstellt werden, wenn das prog geladen wird (so, als ob es eine funktion wäre) und wieder gelöscht werden, wenn das programm entladen wird, wie wenn eine funktion verlassen wird
-
Maxi schrieb:
ich hab mir globale variablen vorgestellt als lokale variablen, die erstellt werden, wenn das prog geladen wird (so, als ob es eine funktion wäre) und wieder gelöscht werden, wenn das programm entladen wird, wie wenn eine funktion verlassen wird
gute vorstellung.
um genau zu sein gibt es für die globalen variablen (und die lokalen static-variablen) einen eigenen speicherbereich. nenne wir ihn mal data-segment.
manche globale variable kann schon vom compiler belegt werden.
double pi=3.14;
diese belegung wird normalerweise so gelöst, daß das data-segment schon in der exe-datei fertig belegt ist. der compiler kann auch tricksen und zwei segmente benutzen, eins für für vorbelegten variablen (das segment wird dann bei programmstart einfach ins ram geladen) und eins für die nicht vorbelegten (die haben 0 drin stehen), das kann dann bei programmstart allokiert werden und verbraucht keinen platz in der exe-datei. und noch eim trick ist möglich, die const-variablen können in ein segment gelegt werden, das schreibgeschötzt ist. entweder ein eigenes rom-segment oder ins code-segment.
-
ah, danke volkard, da weiß ich schonma ein bischen mehr
wieviel passt denn in ein data-segment rein? also, wann ist es voll?
Gelten die 4GB unter win32 eigentlich nur für den heap oder für heap+stack+ds zusammen?
-
Die 4 GB sind vorgegeben durch die 32-Bit-Adressierung. Hat erstmal nix mit Stack und Heap oder so zu tun.
Von den 4GB geht aber einiges an Adressen weg, was sich glaube Windows reserviert.
-
Maxi schrieb:
ah, danke volkard, da weiß ich schonma ein bischen mehr
wieviel passt denn in ein data-segment rein? also, wann ist es voll?
Gelten die 4GB unter win32 eigentlich nur für den heap oder für heap+stack+ds zusammen?die 4G kommen vom prozessor mit seinem 32-bittigen adressbus, wie Pellaeon schon sagte.
4G ist also code+data+heap+stackaußerdem reserviert sich win was. afair das obere G. dein prozess kriegt also eh nur 3G.
der stack ist normalerweise auf 1M beschränkt (kannste aber be den linker-optionen verstellen). von obergrenzen für code und data hab ich noch nie was gehört. der heap besorgt sich bei bedarf vom betriebssystem mehr speicher, gegebenenfalls von der auslagerungsdatei, also new char[1024*1024*1024] ist kein problem, selbst wenn man nur 256M ram hat.