В IL вы можете определить локальные переменные, используя директиву .locals
. Где хранятся эти переменные, стек или куча?
Где хранятся локальные переменные .NET?
Ответ 1
Это очень сложная реализация JIT-компилятора. Он будет очень стараться хранить локальные переменные в регистре CPU, очень эффективно. Стек является обычным хранилищем резервных копий, если для хранения всех локальных переменных недостаточно регистров.
Большая разница между x86 и x64 jitters, например. x64 имеет намного больше доступных регистров. Это также относится к аргументам, переданным методу. x86 позволяет 2 пропускать в регистре CPU, x64 позволяет 4. Плюс все, что может быть сохранено в FPU-стеке или XMM-регистрах. Таким образом, есть действительно четыре разных места, где может храниться локальная переменная.
Ответ 2
В стеке с параметрами... НО.....
1) для ссылочных типов, в стеке хранится только ссылка, а не объект, на который ссылается. Фактический объект хранится в куче.
2) для типов значений фактическое значение сохраняется в стеке.
Теперь, когда поток выполнения в методе достигает закрывающей скобки, данные типа значения в стеке уничтожаются там и тогда, в то время как объекты ссылочного типа в куче (ссылки на которые были здесь, на этом стека методов) передаются в систему сбора мусора для сбора в соответствующее время, определенное самим сборщиком мусора.
Ответ 3
Если объект не является типом значения, он выделяется в куче, и ссылка на него сохраняется в стеке. В противном случае он напрямую выделяется в стеке.