Где хранятся локальные переменные .NET?

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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