Мне интересно, генерирует ли вызов new Vector2(x, y)
мусор или нет.
Это зависит от того, принимает ли первый формальный параметр вызванной функции ссылочный тип или тип значения. Если он принимает тип значения, то нет, здесь не генерируется мусор. Если он принимает ссылочный тип, значение будет помещено в коробку.
Насколько я понимаю, поскольку Vector2 является типом значения и не сохраняется как элемент ссылочного типа, он будет создан в стеке
То, что он не находится в куче, логически не означает, что он генерируется в стеке. Это может быть в реестре.
если подпись требует прохождения структуры "по ref" (с использованием модификаторов "ref" или "out"), будет ли какой-нибудь бокс?
Нет. Вы смешиваете два вида ссылок. «Ссылка», которая является псевдонимом для переменной , не является объектом:
void D(int q) {}
void D(ref int q) {}
void D(object q) {}
Первый метод D берет копию целого числа. Второй D создает псевдоним переменной, содержащей неупакованное целое число. Третье D занимает целое в штучной упаковке.
Я полагаю, что хранение в регистре ведет себя как хранение в стеке с точки зрения сборщика мусора.
Это неверное предположение. Предположим, что значение, которое либо зарегистрировано, либо помещено в стек , содержит ссылку на объект сбора мусора . Джиттер имеет право обрабатывать зарегистрированные ссылки иначе, чем ссылки на стек. Предположим, например, что алгоритм распределения регистров дрожания решает повторно использовать этот регистр для чего-то еще, после того как дрожание узнает, что ссылка больше не будет разыменовываться. Дрожание совершенно свободно, а затем сказать сборщику мусора, что ссылка исчезла. Таким образом, возможно, что 'this' освобождается потоком GC, даже когда метод объекта выполняет .
Джиттер, конечно, также свободен для стека, но это было бы гораздо более агрессивной оптимизацией.