2016-06-29 4 views
2

Ich weiß, dass es mehrere Arten von Speicherzuweisung gibt. Nehmen wir C als Sprachbeispiel, haben wir statische Zuweisung, Stapelzuweisung, Heap-Zuweisung.dynamische und Stapelspeicherzuordnung vom Compiler vorgenommen?

Ich verstehe, dass die statische Zuordnung von Compiler gemacht wird, aber die anderen beiden findet zur Laufzeit statt. Wer ist dafür verantwortlich, ist es der Compiler, der Prozess oder das Betriebssystem?

Ich frage im Grunde, ob der Compiler an der Ausführung eines Programms beteiligt ist?

+3

Die Heap-Zuweisung erfolgt durch spezifische Funktionen: [malloc, realloc, calloc] (http://linux.die.net/man/3/malloc) ... also ist der Coder für die Zuweisung und für die Freigabe zuständig (' frei ') die Erinnerung. Stack wird zur Laufzeit durch Assemblercode erstellt, der vom Compiler zur Kompilierzeit generiert wird. – LPs

+2

Der Compiler ist in keiner Weise beteiligt, wenn das Programm ausgeführt wird. – babon

+0

@LPs: Du hast Recht, poste es als Antwort !!! – Destructor

Antwort

4

Das Betriebssystem ist für die Stapel- und Heapspeicherzuweisung zuständig.

Die OS weist jedem Thread Stapelspeicher zu und die Sprachlaufzeit ruft das Betriebssystem auf, um den Heapspeicher zuzuordnen.

+2

Die meisten C-Programme laufen auf Systemen ohne ein ausgewachsenes Betriebssystem. Und einige haben nicht einmal einen Stack für Variablen. – Olaf

+0

Ich würde sagen, das kommt darauf an, wirklich. Die vollständige Antwort sollte verschiedene Szenarien beinhalten, Hardware-Unterschiede, libc für Barebones (wie avr-libc) oder Linux usw. erklären. Ich stimme mit @Olaf überein - es ist falsch anzunehmen, dass * alle * die Hardware das Betriebssystem, aber den Quellcode ausführt könnte dynamische Zuordnung verwenden. Hier, malloc ohne Betriebssystem: http://www.nongnu.org/avr-libc/user-manual/malloc.html –

-1

Der Compiler ist nicht an der Ausführung eines Programms beteiligt. Seine Aufgabe besteht darin, das Programm auf einer Stufe zu erstellen, von der aus der Linker eine ausführbare Datei erstellen oder eine Engine übernehmen kann, die den Code im Falle eines dynamischen Builders ausführt. Es prüft nur auf einige Protokolle, die für eine bestimmte Sprache befolgt werden müssen.

Die statische Zuweisung (Speicherplatz) hängt von den Dateien ab, mit denen eine Verbindung hergestellt wird, und vom Speicher, der von den statischen Strukturen und Variablen im Code benötigt wird.

Die dynamische Zuweisung wird von der Speicherverwaltungseinheit übernommen, in der die Ressourcen dem Task zugewiesen sind, der sich im Arbeitsspeicher befindet und wo die Heapzuweisung während der Laufzeit stattfindet.

+0

Vielen Dank für Ihre Antwort, es war sehr hilfreich – ddor254