Ответ
Стек (stack) — это область памяти для хранения локальных и временных данных с чётким LIFO (Last-In, First-Out) порядком жизни, привязанных к текущему контексту выполнения (функции, методу).
Что хранится в стеке:
- Локальные переменные типов-значений (Value Types):
Int,Double,Bool,struct,enumи т.д. - Ссылки (указатели) на объекты в куче. Сами объекты — в куче, но переменные, которые на них ссылаются, — в стеке.
- Аргументы, передаваемые в функции.
- Адреса возврата из функций (куда передать управление после завершения).
- Служебная информация о вызове функций (фреймы стека).
Ключевые особенности стека:
- Очень быстрый: Выделение и освобождение памяти — это просто движение указателя стека.
- Автоматическое управление: Память освобождается сразу при выходе из области видимости (scope).
- Ограниченный размер: Размер стека фиксирован и относительно мал (несколько МБ). Переполнение стека — частая причина крашей при глубокой рекурсии.
- Потокобезопасность: У каждого потока свой собственный стек.
Пример:
func calculateSum(a: Int, b: Int) -> Int { // `a` и `b` размещаются в стеке
let result = a + b // Локальная переменная `result` (Int) размещается в стеке
return result
} // При выходе из функции память для `a`, `b`, `result` автоматически освобождается
let x = 5 // `x` (Int) в стеке главного потока
let y = 10 // `y` (Int) в стеке
let sum = calculateSum(a: x, b: y) // При вызове в стек помещаются копии x и y