Как CLR получает доступ к стеку C #?

это может быть очень простой вопрос, но я не смог найти ответ здесь, на SO, и не знал никого, кому я задал ответ:

Я могу написать простой метод c #вроде этого:

private void foo()
{
   int a = 1;
   int b = 5;
}

Если код CIL -(, созданный компилятором ), выполняется общеязыковой средой выполнения, она создаст следующие поля поверх стека, в то время как исполняемый элемент управления находится внутри метода:

b = 5
a = 1

Но теперь я расширяю метод для доступа к полю с именем «a» до этого:

private void foo()
{
   int a = 1;
   int b = 5;
   Console.WriteLine(a);
}

Теперь CLR должна получить доступ к полю, которое не находится на вершине стека, но в соответствии с принципом FILO (first in, last out )она должна позаботиться обо всех полях над запрошенными полями перед доступом к нему..

Что происходит с полем под названием «b», которое находится в стеке над запрошенным полем «a»?

CLR не может удалить его, так как впоследствии он может быть использован исполняемым методом, так что же с ним происходит?

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

Как это работает?

-редактировать-

Возможно, я недостаточно ясно объяснил свои намерения.

Если я напишу такой метод:

private void foo()
{
   int a = 1;
   int b = 5;
   Console.WriteLine(a);
   Console.WriteLine(b);
}

CLR сначала записывает 2 поля в стек, а затем обращается к ним, но в обратном порядке.

Во-первых, он должен получить доступ к полю "a", но чтобы добраться до него, CLR должна позаботиться о поле "b", которое находится над полем "a" в стеке. Он не может просто удалить поле «b» из стека, так как впоследствии он должен получить к нему доступ.

Как это работает?

5
задан buddybubble 31 July 2012 в 13:45
поделиться