Где хранятся локальные переменные .NET? - PullRequest
12 голосов
/ 29 сентября 2010

В IL вы можете определять локальные переменные, используя директиву .locals.Где хранятся эти переменные, стек или куча?

Ответы [ 3 ]

9 голосов
/ 29 сентября 2010

В стеке с параметрами. .. НО .....
1) для ссылочных типов в стеке хранится только ссылка, а не объект еессылаясь на.Фактический объект хранится в куче.
2) для типов значений, фактическое значение сохраняется в стеке.

Теперь, когда поток выполнения в методе достигает закрывающей скобки данные типа значения в стеке тут же уничтожаются, в то время как объекты ссылочного типа в куче (чьи ссылки были здесьв стеке этого метода) передаются в систему сбора мусора для сбора в соответствующее время, определяемое самим сборщиком мусора.

9 голосов
/ 29 сентября 2010

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

Большая разница между джиттерами x86 и x64, например. В x64 доступно гораздо больше регистров. Это также относится к аргументам, передаваемым методу. x86 разрешает 2, передаваемые в регистр процессора, x64 разрешает 4. Плюс все, что может быть сохранено в стеке FPU или регистрах XMM. Итак, в действительности существует четыре разных места, в которых может храниться локальная переменная.

4 голосов
/ 29 сентября 2010

Если объект не является типом значения, он размещается в куче, а ссылка на него сохраняется в стеке. В противном случае он непосредственно выделяется в стеке.

...