2016-12-29 4 views
0
static void Main() 
{ 
    int i; 
    int j; 
    j=10; 
    i=2; 
} 

Ist der Speicher im Stapel für Variablen in der Reihenfolge reserviert, in der ihre Deklaration erscheint oder wird sie bei der Initialisierung zugewiesen?Wann ist Speicher für Werttypen in C# reserviert?

Ich denke Variablen werden auf Stapel in der Reihenfolge geladen, in der sie deklariert werden, während Peers anders argumentieren. Also, nach ihnen wird j zuerst auf den Stapel geschoben, während ich argumentiere, dass ich zuerst geschoben werde. Wer hat Recht?

+0

Wenn dies der einzige Code in Main ist, kann das Erstellen im Release-Modus sie möglicherweise komplett aus dem generierten IL-Code entfernen. –

+0

Mögliches Duplikat von [Bejaht, dass eine Variable bereits belegt ist] (http://stackoverflow.com/questions/18140630/ does-declaring-a-variable-already-occupy-memory) – Takarii

+0

Wenn Ihnen die Reihenfolge dieser beiden Variablen auf dem Stapel wichtig ist, machen Sie in Ihrem Programm etwas falsch. Sie sollten Ihr Programm so schreiben, dass es keine Rolle spielt. Die Idee eines Stacks ist selbst ein Implementierungsdetail, ganz zu schweigen davon, wann und wie Variablen hinzugefügt werden. – Servy

Antwort

0

Die kurze Antwort ist, dass Sie die genaue Reihenfolge der Stapelzuordnungen nicht kennen können.

Operationen können zu Optimierungszwecken sowohl vom Compiler als auch vom Prozessor neu geordnet werden. Und wie Ehsan bereits in einem Kommentar darauf hingewiesen hat, wird Ihr Code möglicherweise gar nicht ausgeführt, wenn ein Release-Build verwendet wird.

Werfen Sie einen Blick auf diesen Artikel The C# Memory Model, kann es helfen zu erklären, warum die genaue Reihenfolge der Zuordnung nicht wirklich etwas ist, was Sie im Voraus wissen können.

Verwandte Themen