Я читал, что GC (Garbage Collectors) перемещает данные в Heap по соображениям производительности, что я не совсем понимаю, почему, поскольку это оперативная память, возможно, для лучшего последовательного доступа, но мне интересно, если ссылки в Stack обновляются, когда происходит такое движение в куче. Но, возможно, адрес смещения остается тем же, но другие части данных перемещаются сборщиками мусора, но я не уверен.
Я думаю, что этот вопрос относится к деталям реализации, поскольку не все сборщики мусора могут выполнять такую оптимизацию, или они могут это делать, но не обновлять ссылки (если это обычная практика среди реализаций сборщика мусора). Но я хотел бы получить общий ответ, специфичный для сборщиков мусора CLR (Common Language Runtime).
А также я читал статью Эрика Липперта "Ссылки не адреса" здесь, и следующий абзац немного смутил меня:
Если вы считаете, что ссылка на самом деле является непрозрачной обработкой GC, тогда становится ясно, что для поиска адреса, связанного с дескриптором, вам нужно как-то "исправить" объект. Вы должны сообщить GC "до дальнейшего уведомления, объект с этим дескриптором не должен перемещаться в памяти, потому что у кого-то может быть указатель на него". (Существуют различные способы сделать то, что выходит за рамки этой стяжки.)
Это похоже на ссылочные типы, мы не хотим, чтобы данные были перемещены. Тогда что еще мы храним в куче, которую мы можем перемещать для оптимизации производительности? Может быть, напечатайте информацию, которую мы храним там? Кстати, на случай, если вам интересно, о чем идет речь, Эрик Липперт немного сравнивает ссылки на указатели и пытается объяснить, как может быть неправильно говорить, что ссылки - это просто адреса, даже если это то, как С# реализует его.
А также, если какое-либо из моих предположений неправильно, пожалуйста, исправьте меня.