GC Roots недоразумение? - PullRequest
       19

GC Roots недоразумение?

3 голосов
/ 30 марта 2012

Я знаю, что корни:

  • статические поля
  • параметры метода
  • местные поля
  • f-очередь, которая также содержит указатель на объекты, которые будут завершены
  • регистры процессора <= ??? </li>

enter image description here

Теперь поговорим о регистрах.

код, который они могут содержать, выглядит так:

mov bx, 0034h   ; bx = 52 (stored in 16 bits)
mov cl, bl      ; cl = lower 8-bits of bx
mov eax, ecx
call print_int

но подождите !

Если я не ошибаюсь, это на самом деле код, который был Держит те эти static, local и parameters - с первого места!

Так зачем писать это ДВАЖДЫ ? (или из другого направления?)

Зачем писать (например)

  Foo f = new Foo();

**and also** 

mov bx, 0034h   //<-------- represents the `f` address or something like that 

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

мой вопрос о регистрах исходит отсюда: enter image description here

enter image description here

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

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

Давайте возьмем вызов метода, например:

object a = new object(), b = new object(), c = new object();
DoSomething(a, b, c);

JIT-компилятор попытается поместить в регистр как можно больше параметров, чем помещать их в стек. Пример, построенный локально на X86, показывает:

00000082  push        dword ptr [ebp-10h] 
00000085  mov         ecx,dword ptr [ebp-8] 
00000088  mov         edx,dword ptr [ebp-0Ch] 
0000008b  call        dword ptr ds:[00742078h] 

Теперь есть более сложные угловые случаи, подумайте о доступе к массиву / объекту.

2 голосов
/ 30 марта 2012

Рассмотрим

string sentence = ...
int wordCount = sentence.Split(' ').Length;

String.Split () создает массив, он должен быть доступен для (части) этого оператора.Но нет переменной или параметра, указывающего на него, оптимизатор, скорее всего, сохранит ссылку в регистре.

Таким образом, регистры ЦП (адреса) должны рассматриваться как часть корней.

2 голосов
/ 30 марта 2012

Регистры только временно содержат значения переменных.

Например, когда вы создаете объект и сохраняете ссылку в переменной:

Foo f = new Foo();

Что происходит, так это то, что конструктор вызывается и возвращает ссылку на объект. На этом этапе ссылка существует только в реестре. Затем содержимое регистра копируется в переменную, поэтому теперь ссылка существует как в регистре, так и в переменной. Затем регистр продолжается и используется для чего-то другого, поэтому ссылка существует только в переменной.


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

...