Хранятся ли reference-типы (экземпляры классов) в стеке в Swift?

Ответ

Нет. Экземпляры классов (reference types) всегда хранятся в куче (heap). В стеке хранятся лишь указатели (references) на эти объекты, а также value-типы (структуры, перечисления, примитивы).

Пример:

class MyClass { } // Reference type -> хранится в куче
struct MyStruct { } // Value type -> хранится в стеке (если не захвачен замыканием)

let object = MyClass() // Указатель `object` хранится в стеке, сам объект — в куче
let value = MyStruct() // Вся структура `value` хранится в стеке

Ключевые моменты:

  • Куча позволяет объектам существовать за пределами scope функции и разделяться между ссылками.
  • Стек работает по принципу LIFO и используется для локальных переменных и вызовов функций.
  • Компилятор Swift может применять оптимизации (например, escape-анализ), чтобы временно разместить объект на стеке, если его lifetime ограничен текущей функцией. Это деталь реализации, не меняющая семантику языка.

Ответ 18+ 🔞

Да ты послушай, что за дичь тут происходит! Сижу я, значит, думаю: ну куда там эти ваши объекты деваются, а? Вроде взрослые люди, а в базовых вещах путаются, ёпта.

Так вот, слушай сюда и запоминай раз и навсегда, чтобы потом не позориться. Экземпляры классов — это reference types, блядь. И живут они, как аристократы, в одной только куче (heap), нах! Всё, точка. Вопросов нет.

А что же в стеке, спросишь ты, хитрая жопа? А в стеке, друг мой, сидят только указатели (references) на этих самых аристократов. Ну и, само собой, всякие value-типы — структуры, перечисления, примитивы — они там же, в стеке, и копошатся. Пока, конечно, их какое-нибудь замыкание не схватит и не утащит с собой в кучу, но это уже другая история, про которую мы как-нибудь в другой раз, когда терпения будет больше, чем ноль ебать.

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

class MyClass { } // Reference type -> хранится в куче
struct MyStruct { } // Value type -> хранится в стеке (если не захвачен замыканием)

let object = MyClass() // Указатель `object` хранится в стеке, сам объект — в куче
let value = MyStruct() // Вся структура `value` хранится в стеке

Видишь? object — это просто бумажка с адресом, лежит в стопочке на столе (в стеке). А сам чувак, MyClass, сидит в особняке (в куче) по этому адресу. А value — это просто камушек, который прямо на столе и лежит.

А теперь главное, чтобы ты не обосрался на собеседовании:

  • Куча — это такое место, где объекты могут жить долго и счастливо, даже когда функция, которая их родила, уже давно померла. И делиться одним объектом могут сколько угодно ссылок. Удобно, блядь.
  • Стек — это как стопка тарелок: последнюю положил — первую снял (LIFO). Туда складывают локальные переменные и вызовы функций. Быстро, чётко, но недолговечно.

А ещё компилятор Swift — он умный, ёпта. Иногда он смотрит на твой код и такой: «О, да этот объект никуда не сбегает из функции, зачем ему в куче-то маяться?». И может, в виде оптимизации, временно пристроить его на стек. Но это уже такие дебри реализации, что тебе, пока, нахуй не нужно. Главное — семантика: классы — куча, указатели на них — стек. Запомнил? Иди, теперь работай.