Что хранится на стеке
Что проверяют
Понимаете ли вы, где на самом деле живут значения в Swift, или заучили строчку про структуры на стеке и классы в куче. За вопросом обычно стоит следующий: почему замыкание продлевает жизнь переменной, почему массив копируется дёшево и откуда берётся падение на рекурсивном обходе.
Как отвечать
На стеке лежит фрейм вызова: адрес возврата, сохранённые регистры, аргументы, которые не поместились в регистры, и локальные значения. Стек свой у каждого потока, растёт и сокращается по вызову и возврату, освобождение бесплатно и не требует ни подсчёта ссылок, ни сборщика.
Что там оказывается на практике: локальные значимые типы, если они не убегают из области видимости, ссылки на экземпляры классов, небольшие кортежи и перечисления. Чего там нет: самих экземпляров классов, буферов Array, String, Dictionary и Set, боксов переменных, захваченных убегающим замыканием, значений, не поместившихся во встроенный буфер контейнера протокольного типа.
Важная оговорка, которую ждут: структура на стеке не всегда. Структура, объявленная полем класса, лежит в куче внутри объекта. Структура с массивом внутри держит ссылку на буфер в куче, и копирование при записи означает, что дешёвая на вид копия обернётся настоящим выделением при первой мутации.
Хорошо добавить про размер: стек потока ограничен и задаётся при его создании, у главного он заметно больше, чем у фоновых. Отсюда практическое правило: рекурсия по дереву произвольной глубины и большие локальные буферы это не то, что держат на стеке.
Где спотыкаются
Отвечают «значимые типы на стеке, ссылочные в куче» как законом. Размещение решает компилятор: объект, не покидающий функцию, может остаться на стеке, а структура, захваченная замыканием, уедет в кучу.
Обещают обработать переполнение стека. Поймать его как ошибку нельзя: поток падает на защитной странице, и лечение одно, переписать рекурсию в цикл со своим стеком либо увеличить размер стека потока.
Считают, что раз значение на стеке, подсчёта ссылок нет совсем. Локальная ссылка живёт во фрейме, но операции удержания и освобождения никуда не деваются, и в горячем цикле их цена видна в профайлере.