Ответ вслух Junior Типы значений и ссылочные спрашивают часто обновлено

Стек и куча в .NET

Вопрос

Расскажите, что такое стек и куча в .NET и что где хранится.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Стек это область памяти потока, где лежат кадры вызовов: параметры, локальные переменные, адрес возврата. Он освобождается сам при выходе из метода, поэтому работа с ним почти бесплатна.

Что должно прозвучать в ответе

  • Стек: кадры вызовов методов, локальные переменные и параметры, освобождается автоматически при выходе

  • Куча: объекты ссылочных типов, ими управляет сборщик мусора

  • Тип значения хранится там, где объявлена переменная: поле класса лежит в куче внутри объекта

  • Упаковка переносит копию значения в кучу

  • Локальные переменные в лямбдах и async-методах переезжают в объекты в куче (замыкания, машина состояний)

Что могут спросить следом

  • Почему фраза «структуры всегда на стеке» неверна?
  • Что такое ref struct и зачем ему запрет на кучу?

Разбор

Стек это область памяти потока, где лежат кадры вызовов: параметры, локальные переменные, адрес возврата. Он освобождается сам при выходе из метода, поэтому работа с ним почти бесплатна. Куча это общая память процесса для объектов ссылочных типов, её чистит сборщик мусора.

Частая ошибка говорить «структуры на стеке, классы в куче». Точнее: объекты классов всегда в куче, а тип значения живёт там, где его переменная. Локальная int обычно на стеке или в регистре, а поле int в классе лежит внутри объекта в куче. Элементы массива int[] тоже в куче, внутри массива.

Есть случаи, когда локальные переменные уезжают в кучу: при захвате в лямбду компилятор создаёт класс-замыкание, а в async-методе локальные переменные становятся полями машины состояний. Упаковка тоже копирует значение в кучу. Исключение в обратную сторону ref struct, например Span<T>: компилятор запрещает ему попадать в кучу.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме