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

Является ли память выделенной в стеке для переменных в том порядке, в котором их объявление появляется или будет выделено по мере их инициализации?Когда память выделена для типов значений в C#?

Я думаю, что переменные загружаются в стек в том порядке, в котором они объявлены, в то время как аналоги утверждают иначе. Таким образом, по их словам, j сначала помещается в стек, а я утверждаю, что я сначала помещен в стек. кто прав?

+0

Если это единственный код в Main, создание в режиме деблокирования может полностью удалить их из сгенерированного кода IL –

+0

Возможный дубликат [имеет ли объявление переменную уже занимать память] (http://stackoverflow.com/questions/18140630/ is-declaring-a-variable-already-Occupy-memory) – Takarii

+0

Если вам интересно, какой порядок этих двух переменных находится в стеке, вы делаете что-то не так в своей программе. Вы должны писать свою программу таким образом, чтобы это не имело значения. Сама идея стека сама по себе является частью реализации, не говоря уже о том, когда и как переменные добавляются к ней. – Servy

ответ

0

Короткий ответ заключается в том, что вы не можете точно знать порядок распределения стека.

Операции могут быть переупорядочены как компилятором, так и процессором для целей оптимизации. И, как уже указывал Эхсан в комментарии, ваш код может вообще не выполняться, когда используется сборка релиза.

Посмотрите на эту статью The C# Memory Model, это может помочь объяснить, почему точный порядок распределения - это не то, что вы можете знать заранее.

Смежные вопросы