Хранение локальных переменных в c#

308
01 июля 2017, 08:41

Пытаюсь разобраться с хранением данных в c#. Вот например, есть ,когда IL-оператор Stloc берет верхнее значение стека и помещает его в локальную переменную, где эта сама переменная хранится? Например,

    static void Main()
    {
        {
            int x = 5;
        }
    }

В Il-нотации это

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] int32 num)
    L_0000: nop 
    L_0001: nop 
    L_0002: ldc.i4.5 
    L_0003: stloc.0 <---В какую область памяти упадет значение из стека?
    L_0004: nop 
    L_0005: ret 
}
Answer 1

В Майкрософтовской CLR локальные переменные хранятся обычно* в стеке, в фрейме, выделенном для текущей функции. Стек — деталь имплементации текущего JIT-компилятора, его нет на уровне IL-кода (и может в принципе не быть в других имплементациях CLR).

IL-код представляет собой стековую машину, стек которой для Microsoft CLR лишь описательная конструкция, и преобразуется в «обычный» регистровый код при JIT-компиляции. IL-стек не имеет ничего общего со стеком, с которым работает JIT-компилятор, и является лишь формальным компонентом.

*Исключения:

  • Переменная может попасть в замыкание, тогда она поднимается до поля созданного класса
  • Переменная может быть в генераторе (yield-функции) или async-функции, тогда она поднимается до поля созданной для функции стейт-машины.
  • Переменная может быть уничтожена оптимизатором на этапе компиляции (или JIT-компиляции), тогда её вообще нигде нет.
READ ALSO
потеряется ли память при thread.Abort()?

потеряется ли память при thread.Abort()?

запускаю поток, в нем открывается форма с помощью ApplicationRun(frm)

259
вызов команд PowerShell для ExchangeServer 2010 из приложения C#

вызов команд PowerShell для ExchangeServer 2010 из приложения C#

Приложение должно выполнить команды по созданию mailbox напримерЗапускаться в локальной сетке, но не с машины где стоит сам Exchange

240
Как сгененировать GUID код внутри textBox?

Как сгененировать GUID код внутри textBox?

Подскажите, есть ли способ сгенерировать GUID код, с фигурными скобками?

370