ldflda выталкивает сам объект из стека. он не сможет "протолкнуть" объект как корень GC, потому что, когда он узнает, чтобы вытолкнуть его? Единственный разумный способ узнать это - использовать стек ... Я почти уверен, что объект сохраняется во внутреннем указателе.

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

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

using System;

public class Foo
{
    public int field;

    public static void Increment(ref int x) {
        System.GC.Collect();
        x = x + 1;
        Console.WriteLine(x);
    }

    public static void Main()
    {
        Increment(ref new Foo().field);
    }
}

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

Ответы на вопрос(3)

Ваш ответ на вопрос