В .NET, каков конкретный тип ссылки на объект? - PullRequest
5 голосов
/ 02 февраля 2011

Т.е. как называется структура данных типа значения, хранящаяся в стеке, которая ссылается на объект в куче?

Т.е. ссылка на объект - System.What (если вообще что-нибудь)?

Я знаю, что это не указатель , или это так?

Я знаю, что это "как" указатель.

Я знаю, что он принадлежит сборщику мусора".

Я НАСТОЯЩИМ убежден, что когда вы создаете экземпляр объекта (то есть ссылочного типа), то IL дает команду CLR для выделения" пары значений стека / значения кучи "в памяти (например, * 1013).*

...
      .locals init ([0] int32 i1,
               [1] object o1,
               [2] int64 l1)
      IL_0000:  nop
      IL_0001:  ldc.i4.4
      IL_0002:  stloc.0
      IL_0003:  newobj     instance void [mscorlib]System.Object::.ctor()
      IL_0008:  stloc.1
      IL_0009:  ldloc.0
      IL_000a:  box        [mscorlib]System.Int32
...

), и что фактическая ссылка недоступна на уровне языка или IL (кроме копирования / назначения новой ссылки или манипулирования ссылочным объектом), и что выделение ссылки на объект создается и управляетсяCLR / CLI и CLR вставляют в стек значение OBJECTREF DWORD (или аналогичное).

Пожалуйста, укажите прямо и покончите с этим для всех авторов книг и поисков в Google.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 02 февраля 2011

Тип значения, созданный в стеке, не имеет ссылки на какой-либо объект в куче - нет соответствующего объекта в куче .Это будет создано только в том случае, если тип значения помечен в штучной упаковке - в этом случае все еще не будет никакой связи между этими двумя.

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

Вот простой метод:

    private void TestBoxing()
    {
        int i = 52;
        object io = i;
        io = "something else";

    }

А вот сгенерированный код IL:

.method private hidebysig instance void  TestBoxing() cil managed
{
  // Code size       18 (0x12)
  .maxstack  1
  .locals init ([0] int32 i,
           [1] object io)
  IL_0000:  nop
  IL_0001:  ldc.i4.s   52
  IL_0003:  stloc.0
  IL_0004:  ldloc.0
  IL_0005:  box        [mscorlib]System.Int32
  IL_000a:  stloc.1
  IL_000b:  ldstr      "something else"
  IL_0010:  stloc.1
  IL_0011:  ret
} // end of method Program::TestBoxing

Как выМожно видеть, что .locals init ([0] int32 i, [1] object io) - это не что иное, как инициация локальных переменных, одного целого и одного объекта.


(обновление)

Я спрашивал, каков конкретный типссылка в стеке, которая ссылается на объект в куче

Это простая ссылка на объект , аналогичная всем ссылкам на объекты, которые ссылаются на точку в памяти, которая имеет 4указатель байтового типа и 4-х байтовый блок синхронизации, а затем остаток - это столько места, сколько требуется объекту, в нашем случае int требуется 4 байта, поэтому 12 байтов.


(Update2)

ХорошоЯ не думаю, что у него есть имя, это внутренний указатель CLR (32-битный или 64-битный в зависимости от времени выполнения), который не используется вне CLR и не отображается.Как вы уже знаете, он управляется GC, поскольку значение будет изменяться после перемещения объектов в куче после сборки мусора.

2 голосов
/ 02 февраля 2011

Это указатель, размер которого соответствует собственной длине слова (т. Е. 32-разрядный указатель на x86, 64-разрядный указатель на x64).У него нет CTS-выставленного «типа» в том смысле, который, я думаю, вы имеете в виду.

...