Wann wird Speicher reserviert, während der Kompilierung?
Wenn ich Schreibe
int main()
{
int j;
}
Den Speicher für j
zugeordnet ist, zu der Zeit der Zusammenstellung, aber wenn während der Kompilierung?
Was sind die verschiedenen Stufen des übersetzungsvorganges, wenn der Speicher zugeteilt ist eine variable?
Was ist, wenn j
global waren?
- Bitte formatieren Sie Ihre Frage. Doppelte Leerzeichen, bricht die Linie.
- irgendwie habe ich das Gefühl, dass Ihre Frage ist nicht eindeutig, und Ihre Frage, name und Beschreibung sind inkonsistent.
- Wenn die Frage über die Speicherzuweisung für die verschiedenen Bereiche in C, dann sollte der Titel geändert werden, um dies entspricht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, du vermischt die Dinge.
Compiler nicht reservieren von Speicher für Variablen - es generiert code, der die Zuweisung von Speicher für Variablen zur Laufzeit. Für globals Hinzugefügt werden, um das Programm start-up-code.
In C, main kompiliert ist die gleiche wie jede andere Funktion: alle Variablen, die in main werden "zugeteilt" auf dem stack. Ein stack frame ist der Teil des Stapels, der durch einen einzigen Funktionsaufruf. Der frame enthält Steckplätze für alle von den einheimischen verwendet wird, innerhalb einer Funktion. Dieser Speicher wird als vorübergehend angesehen, da, wenn die Funktion zurückgibt, wird dieser Rahmen geknallt werden aus dem Stapel.
Den C-compiler vergeben eine statische IP-Adresse zu globalen Variablen. Diese Adresse wird als Teil der binären die "Bild" - und als solche hat eine statische Position im Speicher. Der C-compiler kennt die Größe jeder Art, so kann es beiseite legen und die entsprechende Menge an Raum in den Speicher layout der binäre für jede Globale variable. Dann code, der greift auf diese variable verweisen Sie einfach auf diese Adresse statt.
Können Sie prüfen, eine variable, die die Adresse mit code wie diesem:
Läuft dieser code erzeugt eine Ausgabe ähnlich zu:
Gibt es zwei Dinge, die Sie beachten sollten, hier:
foo
ändert sich mit jedem Aufruf von foo. In der Tat, es verringert sich jedes mal, da der stack wächst nach unten.Nicht auf die Zeit der Zusammenstellung, Ihre 'int' j ' wird zugeteilt die beim Start der Anwendung, wenn die Anwendung geben Sie main() Umfang (eigentlich ist es technisch nicht zugeteilt, da der stack verwendet wird), globals wird zugeordnet zur Laufzeit vor Eintritt in main() Rahmen.
Zusammenstellung generiert den ausführbaren code für ein Programm. Programm Speicher reserviert, als dass der ausführbare code wird ausgeführt.
Die Kompilierung nicht den Speicher. Es erzeugt den code, der den Speicher reserviert 🙂
In diesem Fall j wäre ein so genannter stack-variable, und es würde zugewiesen werden, wenn die Ausführung tritt der main () - Funktion.
Globale und statische Variablen reserviert auf dem heap statt.
Hier eine kurze Erklärung: http://www.costech.or.tz/cs231/websites/C%20Programming/www-ee.eng.hawaii.edu/Courses/ee150/Book/chap14/subsection2.1.1.8.html. Ich werde sehen, ob ich finden kann, eine bessere.
Ist es bis zum compiler, wo zu Ort j. In der Regel lokale Variablen auf dem Stapel abgelegt und als solche für Ihre besonderen Beispiel, der compiler wird wahrscheinlich behalten uns das Speicherplatz auf dem stack für die Dauer der main-Funktion. Beachten Sie, dass dies unterscheidet sich von globalen Variablen-Speicher, die möglicherweise über Ihren eigenen Arbeitsspeicher.
Der Speicher ist nicht zugeordnet zu der Zeit der Zusammenstellung, aber bei der Laufzeit.
Der compiler gerade erzeugte Maschinen-code, wird Ihr Programm auszuführen, können die tatsächlichen Zuweisungen geschehen zur Laufzeit.
In diesem Fall wird die variable nicht verwendet wird und es wird nicht emittiert jeder code für es.
Ich denke, Sie sind auf der Suche in den Phasen der Zusammenstellung, anstatt die Speicherzuordnung 'j'. Da ich denke also, hier ist was passiert:
Einmal füttern Sie Ihre source-code des C-Compilers, der ersten Stufe(E) ist(sind) lexikalische und semantische Analyse, in der syntax und der Semantik der source-code analysiert, für die Richtigkeit. Wenn eine Fehlermeldung(en) gefunden wurde, meldet der compiler entsprechend und geht nicht voran. Wenn keine Fehler gefunden wurden, geht es um die Generierung einer zwischendarstellung des Quelltextes, in der Regel nach verschiedenen Optimierungen. Dieser zwischendarstellung werden können, die in einer Landessprache (native OS/Architektur, wie in C) oder einen Plattform unabhängigen bytecode (wie Python/Java..). Die Funktion der compiler endet hier.
Speicherzuweisung geschieht nur, wenn Sie den code auszuführen. Dies ist die Laufzeit des Programms. Dieser kommt erst nach der Zusammenstellung der Bühne, die Sie wahrscheinlich würde nicht wollen, zu wissen, hier. Wenn Sie möchten, lassen Sie es mich bitte wissen. Ich werde versuchen, und fügen Sie, was ich weiß.
HTH.