Стек и куча в .NET
Вопрос
Расскажите, что такое стек и куча в .NET и что где хранится.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Стек: кадры вызовов методов, локальные переменные и параметры, освобождается автоматически при выходе
Куча: объекты ссылочных типов, ими управляет сборщик мусора
Тип значения хранится там, где объявлена переменная: поле класса лежит в куче внутри объекта
Упаковка переносит копию значения в кучу
Локальные переменные в лямбдах и async-методах переезжают в объекты в куче (замыкания, машина состояний)
Что могут спросить следом
- Почему фраза «структуры всегда на стеке» неверна?
- Что такое ref struct и зачем ему запрет на кучу?
Разбор
Стек это область памяти потока, где лежат кадры вызовов: параметры, локальные переменные, адрес возврата. Он освобождается сам при выходе из метода, поэтому работа с ним почти бесплатна. Куча это общая память процесса для объектов ссылочных типов, её чистит сборщик мусора.
Частая ошибка говорить «структуры на стеке, классы в куче». Точнее: объекты классов всегда в куче, а тип значения живёт там, где его переменная. Локальная int обычно на стеке или в регистре, а поле int в классе лежит внутри объекта в куче. Элементы массива int[] тоже в куче, внутри массива.
Есть случаи, когда локальные переменные уезжают в кучу: при захвате в лямбду компилятор создаёт класс-замыкание, а в async-методе локальные переменные становятся полями машины состояний. Упаковка тоже копирует значение в кучу. Исключение в обратную сторону ref struct, например Span<T>: компилятор запрещает ему попадать в кучу.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Типы значений и ссылочные»
- Что такое boxing и unboxing
- Сравнение двух упакованных чисел через ==
- Когда происходит упаковка
- Переприсваивание параметра-класса
- default и конструктор структуры без параметров
- Число различных точек
- Сумма int с переполнением, как в unchecked
- Среднее с пропусками (int?)