@Akaero

Как уничтожаются объекты значимых типов?

Мне известно про сборщик мусора, который работает в куче, однако, как и когда удалются объекты значимых типов из стека?
  • Вопрос задан
  • 240 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C#
1. В теории реализация не обязана использовать стек для хранения локальных объектов value-типов (см. https://blogs.msdn.microsoft.com/ericlippert/2009/... ).
2. Тем не менее, в текущих реализациях используется именно стек, поэтому всё как и в остальных языках: https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D... .
3. Помните, что значения value-типов иногда (не всегда) хранятся на стеке. Все значения value-типов, являющиеся частью объекта ссылочного типа (например, int-поле в классе или элементы массива double) рождаются и умирают вместе с этим объектом.

Итого:
  • время жизни локальных объектов value-типов связывается с фреймом стека;
  • время жизни объектов value-типов, находящихся в составе объектов reference-типов, связывается с временем жизни объемлющего объекта;

Более экзотические ситуации рассматривать не будем. И вообще, как говорит Липперт (см. ссылку), лучше не думать в терминах стека, т.к. это деталь реализации. Лучше говорить о времени жизни относительно вызываемых функций и относительно других объектов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Griboks
@Griboks Куратор тега C#
Если мне не изменяет память, то значимые типы - это те же сами ссылки на объекты в памяти. Следовательно, никакой разницы нет.
Ответ написан
@MIsternik
А они не удаляются. Стек это же последовательность, например такая: 1|2|0|*|4|5|14.
* - это граница между переменными разных методов. т.е если метод 1 вызывает метод 2, то 1|2|0 это переменные первого метода, а 4|5|14 второго метода.
Когда второй метод вернет управление, то указатель стека укажет на начало списка переменных первого метода а про второй забудет. Но это не значит что они удалятся. Потом они просто будут перезаписаны другими значениями, когда эти адреса памяти понадобятся
Ответ написан
Комментировать
yarosroman
@yarosroman Куратор тега C#
C# the best
Из одной умной книги.

"Освобождение памяти на стеке также выполняется весьма эффективно и требует лишь восстановления прежнего значения регистра указателя стека. Из-за особенностей компиляции методов в машинный код, компилятору часто даже не требуется запоминать общий объем, занимаемый локальными переменными метода, и он может уничтожить весь кадр стека тремя стандартными инструкциями, известными как эпилог метода."
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы