Wie speichert ein Programm eine Variable?
-
Aber so ein Maschinenprogramm ist doch ein fertiges Programm. Da muss ja dann für die Variablendeklaration etwas wie:
"Reserviere Speicher 00FFAA55 - 00FFAA58 für i vom Typ int (--> 4 Byte Größe)" stehen. Jetzt können für die Adressen beim Kompilieren bestimmt keine festen Werte eingesetzt werden, da der Kompiler ja nicht wissen kann welcher Speicherblock dem Programm auf einem beliebigen Computer zugeteilt wird.
Und das ist was ich nicht verstehe. Theoretisch müsste dem Programm ja vor Start gesagt werden, wo es speichern kann. Und erst nachdem das Programm das weiß, kann es konkrete Adressen für die Reservierung festlegen. Aber dem würde widersprechen, dass die .exe-Datei ja bereits komplett fertig ist. Oder wird die .exe-Datei während ihrem Start verändert?
-
Computer die in der Lage sind, mehrere Programme gleichzeitig auszuführen, funktionieren anders als du denkst:
http://en.wikipedia.org/wiki/Virtual_memory
-
Der Compiler sagt dem Linker dass er die Variable braucht. Der Linker vermerkt das in der EXE und beim Laden des Programms weist das OS den Speicher zu.
-
anderer Tobi schrieb:
"Reserviere Speicher 00FFAA55 - 00FFAA58 für i vom Typ int (--> 4 Byte Größe)" stehen. Jetzt können für die Adressen beim Kompilieren bestimmt keine festen Werte eingesetzt werden, da der Kompiler ja nicht wissen kann welcher Speicherblock dem Programm auf einem beliebigen Computer zugeteilt wird.
Doch das ist möglich, da, wie gesagt wurde jedes Programm seinen eigenen Adressbereich hat. Das Betriebssystem regelt dann das mappen von virtuellen Speicher auf die echten Adressen. Darum kannst du auch nicht durch irgendwelche Zeigermanipulation deinen Computer zum absturz bringen. Wenn du ausserhalb von deinem zugewiesenen Speicher was machst, dann merkt das OS das üblicherweise und du bekommst eine schöne Fehlermeldung, dass dir nicht erlaubt ist auf diesen Bereich zuzugreifen.
Das heisst, dass du durchaus bei solchen Variablen sagen kannst, dass alles bereits in der exe definiert ist, wo was ist. (sehr wahrscheinilch befinden sich automatische Objekte im Data Segment). Wenn du dann Speicher dynamisch (also zur Laufzeit des Programmes) anforderst, dann geschieht das üblicherweise über eine Betriebssystemspezifsche Funktion. Bei Windows hast du hier die Funktionen:
http://msdn.microsoft.com/en-us/library/aa366781(VS.85).aspxEs sei aber gesagt, dass deine Frage nur Systemspezifisch beantwortet werden kann. Ich habe das jetzt mal denke ich aus einer allgemeinen Seite beantwortet, aber wie das zu geschen hat ist nirgends in der Sprache C++ definiert. Ein Compiler kann das so regeln, wie er möchte, so lange es sich korrekt Verhält.
-
Also wenn ich das richtig verstanden habe, wäre eine mögliche Anweisung der ausführbaren Datei:
"Reserviere Speicher 00000000 - 00000003 für i vom Typ int (--> 4 Byte Größe)"
Wobei sich die Adressangaben auf den virtuellen Speicher beziehen und im physikalischen Speicher irgendwo anders liegen ( Also nicht am Anfang des Speichers ).
Und während die Datei ausgeführt wird, wird der Befehl mit der virtuellen Adresse abgeschickt, passiert die 'Memory Management Unit' wo die Adresse in die 'echte Adresse' umgewandelt wird. Und schließlich ereicht der Reservierungsbefehl sein Ziel und ich habe die Kontrolle über eine Speicherzelle, von der ich keine Ahnung habe wo sie sich tatsächlich befindet.
Stimmt das?
-
andere Tobi schrieb:
Also wenn ich das richtig verstanden habe, wäre eine mögliche Anweisung der ausführbaren Datei:
"Reserviere Speicher 00000000 - 00000003 für i vom Typ int (--> 4 Byte Größe)"Ja, in etwa. Der Typ wird nicht mitgespeichert, nur ob es sich um eine lokale Variable handelt (temporär) oder Eine, die die ganze Programmlaufzeit über gültig ist.
Wenn das Programm Debug-Informationen enthält, werden vermutlich auch Typ und Variablenname mitgespeichert bzw. sie kommen in eine separate Datei, die der Debugger auswertet.
-
Danke für die guten Antworten. Jetzt hab ich das soweit verstanden, dass ich in Ruhe ( vor mir selbst ^^ ) weiter machen kann.
MfG Tobi
-
Die eigentliche Antwort zum Code wurde noch nicht genannt.
Da die Variable 'i' hier lokal ist, wird sie auf dem Stack gespeichert (also relativ) - und die Stackadresse wird dem Prozess beim Start vom Betriebssystem mitgegeben (normalerweise in einem Prozessorregister).
-
Th69 schrieb:
Die eigentliche Antwort zum Code wurde noch nicht genannt.
Da die Variable 'i' hier lokal ist, wird sie auf dem Stack gespeichert (also relativ) - und die Stackadresse wird dem Prozess beim Start vom Betriebssystem mitgegeben (normalerweise in einem Prozessorregister).Das Betriebssystem wird nach dem Programm gestartet?
Im übrigen muss deine Antwort nicht unbedingt korrekt sein (und doch ich habe das eigentlich doch bereits gesagt). Es kann durchaus Systeme geben, wo das anderst gelöst ist.. Alles, was man hier mit Garantie sagen kann ist, dass der Speicher nach der main wieder frei gegeben wird.
-
drakon schrieb:
Das Betriebssystem wird nach dem Programm gestartet?
Sehr witzig

Soll ich vllt. Klammern darum setzen?
(und die Stackadresse wird dem Prozess beim Start) vom Betriebssystem mitgegeben
-
Th69 schrieb:
drakon schrieb:
Das Betriebssystem wird nach dem Programm gestartet?
Sehr witzig

Soll ich vllt. Klammern darum setzen?
(und die Stackadresse wird dem Prozess beim Start) vom Betriebssystem mitgegebenTut mir leid, aber ich find das wirlich unglücklich formuliert.

-
drakon schrieb:
Tut mir leid, aber ich find das wirlich unglücklich formuliert.

Ohne deinen Einwand hätte ich das ehrlich gesagt gar nicht bemerkt...

-
Ist das wieder so eine Schweizerdeutsch-Geschichte? "beim Start vom Betriebssystem" ist IMHO an sich ziemlich schlechter Ausdruck, wenn damit "beim Start des Betriebssystems" gemeint sein sollte.
-
Bashar schrieb:
Ist das wieder so eine Schweizerdeutsch-Geschichte? "beim Start vom Betriebssystem" ist IMHO an sich ziemlich schlechter Ausdruck, wenn damit "beim Start des Betriebssystems" gemeint sein ist.
Hmm. Ja ich denke das ist der Grund. Im Schweizerdeutschen wird das wirklich so (mit dieser Bedeutung) benutzt.
@Nexus:
"d'stack adresse wird am prozess bim start vom betriebssystem mitgeh"
Würdest doch auch so verstehen, dass das Betriebssystem nach dem Programm gestartet wird, oder?
-
drakon schrieb:
@Nexus:
"d'stack adresse wird am prozess bim start vom betriebssystem mitgeh"
Würdest doch auch so verstehen, dass das Betriebssystem nach dem Programm gestartet wird, oder?Jo

Genauer gesagt nicht unbedingt "nach", sondern "während" (es heisst ja beim Start).Mir scheint aber, hier hätte ich auf Anhieb deutsch gelesen... :p
-
Ich habe es korrekt gelesen und erst beim Beitrag von drakon bemerkt, dass man es grundsätzlich auch anders verstehen könnte. Tja, vielleicht hatte ich den Vorteil, dass ich nie Schweizerdeutsch schreibe. Sobald ich lese oder schreibe, verwende ich die Schriftsprache und probiere umzustellen. Schliesslich hat man immer am meisten Fehler in den Aufsätzen gemacht, wenn man sich die Sätze in Schweizerdeutsch überlegt und dann übersetzt hat

(Und meine Schriftsprache ist immernoch fürchterlich, man stelle sich nur vor, wie das früher bei mir war. Da habe ich fast Mitleid mit meinen Deutschlehrer/Innen :D)
Grüssli