2016-07-09 2 views
0

In C# Wann erfolgt die Speicherzuordnung in Stack/Heap. Ist es während der Laufzeit oder Kompilierzeit. Aus meiner Studie verstehe ich, dass alle Speicherzuweisungen während der Laufzeit sowohl für den Werttyp als auch für den Referenztyp erfolgen. Ist das richtig?C# Speicherzuordnung in Stack/Heap tritt auf

+1

Ja, die Speicherzuweisung kann zur Kompilierzeit nicht erfolgen. Nur wenn das Programm ausgeführt wird, sind alle Objekte ("struct" oder "class") erforderlich, die von dem Programm benötigt werden, das in den Speicher geladen wird. – EvilTak

+1

Es ist korrekt ...... – zerkms

+1

Man könnte argumentieren, dass die Zuordnung auf dem Stack zur Kompilierzeit auftritt. Andererseits muss der Befehl, der den Stapelzeiger tatsächlich ändert, zur Laufzeit ausgeführt werden. Das ist eine dumme Frage. Vielleicht sollten Sie nachlesen [was der Stack und der Heap sind] (http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap). –

Antwort

1

Wie würde es während der Kompilierzeit passieren? Das Programm läuft noch nicht und es ist nicht notwendig, Speicher vor dem Programmlauf zu reservieren. Es ist allgemein bekannt, dass dies zur Laufzeit geschehen sollte (wenn die erzeugte IL tatsächlich ausgeführt wird).

Speicherverwaltung es auch optimiert, dass es nicht passieren kann, wenn Sie nur die Variable erstellen, aber wenn Sie es zuerst verwenden.

0

Ich denke, Sie verwirren die tatsächliche Zuordnung, die nur zur Laufzeit passieren kann, wenn das Programm tatsächlich ausgeführt wird, mit der Zuweisung Berechnung/Bestimmung. Betrachten wir zum Beispiel die folgende Methode:

void Foo() 
{ 
    int i = 42; 
    Console.WriteLine(i); 
} 

Der Compiler wird nun statisch (kompilieren Zeit), daß i 4 Bytes an Speicherplatz auf dem Stack benötigen. Es wird jedoch nicht sein, bis das Programm tatsächlich ausgeführt wird, dass die tatsächliche Zuweisung stattfindet.

Darüber hinaus wird die obige Methode nicht einmal in Maschinencode (eine Voraussetzung für jede Operation wie Zuweisung) kompiliert, bis die CLR den Code lädt und an den JIT (Just in Time Compiler) übergibt. Selbst wenn dies der Fall ist, weist das Betriebssystem erst dann einen Speicheradressraum zu, wenn es erstellt wurde.