Передайте 'тип значения' в стеке по ссылке - объем памяти - PullRequest
3 голосов
/ 25 августа 2009

Что происходит в памяти, когда мы передаем тип значения - который был сохранен в стеке - по ссылке?

Где-то должно быть создано временное значение / указатель, чтобы изменить исходное значение, когда метод завершится. Может, кто-нибудь объяснит или укажет мне на ответ - в памяти много вещей, но никто не отвечает на это. ти

Ответы [ 2 ]

4 голосов
/ 25 августа 2009

Если у вас есть такой метод:

static void Increment(ref int value)
{
   value = value + 1;
}

и назовите это так:

int value = 5;
Increment(ref value);

тогда получается, что вместо значения 5, помещаемого в стек, местоположение переменной value помещается в стек. То есть содержимое value изменяется непосредственно Increment, а не после завершения метода.

Вот IL метода и вызова метода соответственно:

.method private hidebysig static void Increment(int32& 'value') cil managed
{
    .maxstack 8
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: ldarg.0 
    L_0003: ldind.i4         // loads the value at the location of 'value'
    L_0004: ldc.i4.1 
    L_0005: add 
    L_0006: stind.i4         // stores the result at the location of 'value'
    L_0007: ret 
}

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 9
    .locals init ([0] int32 value) //   <-- only one variable declared
    L_0000: nop 
    L_0001: ldc.i4.5
    L_0002: stloc.0 
    L_0003: ldloca.s 'value'   // call Increment with the location of 'value'
    L_0005: call void Program::Increment(int32&)
    L_000a: ret 
}
0 голосов
/ 25 августа 2009

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

Есть много статей, описывающих этот процесс, я постараюсь найти несколько приличных - , но вот для начала .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...