Страницы

Поиск по вопросам

пятница, 5 октября 2018 г.

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

Пытаюсь разобраться с хранением данных в 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 }


Ответ

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

*Исключения:
Переменная может попасть в замыкание, тогда она поднимается до поля созданного класса Переменная может быть в генераторе (yield-функции) или async-функции, тогда она поднимается до поля созданной для функции стейт-машины. Переменная может быть уничтожена оптимизатором на этапе компиляции (или JIT-компиляции), тогда её вообще нигде нет.

Комментариев нет:

Отправить комментарий