Стек — это область оперативной памяти (RAM/ОЗУ), которая создаётся для каждого потока. Он работает в порядке LIFO (Last In, First Out), то есть последний добавленный в стек кусок памяти будет первым в очереди на вывод из стека.
Каждый раз, когда функция объявляет новую переменную/ссылку на класс/функции, она добавляется в стек, а когда эта переменная пропадает из области видимости (например, когда функция заканчивается), она автоматически удаляется из стека.
! Стек предназначен для хранения значимых типов (value type) и ссылок на ссылочные типы (reference type).
Стек обычно никогда не фрагментирован (наверное можно придумать реализации стека с фрагментацией, но это оксюморон)
Когда заводим переменную в стеке, то переменная доступна только во время жизни потока
Из-за такой природы стека управление памятью оказывается весьма логичным и простым для выполнения на ЦП; Стек еще и быстрее потому, что у него единственный параметр с которым работает - это указатель положения стека (обычно регистр) - поэтому все операции со стеком работают в разы быстрее чем с кучей. Операция извлечения/записи из стека это 1 телодвижение процессора POP
/PUSH
.
Тем не менее, у такой строгой формы управления есть и недостатки. Размер стека — это фиксированная величина, и превышение лимита выделенной на стеке памяти приведёт к переполнению стека. Размер задаётся при создании потока (кратный 4KB), и у каждой переменной есть максимальный размер, зависящий от типа данных. Это позволяет ограничивать размер некоторых переменных (например, целочисленных), и вынуждает заранее объявлять размер более сложных типов данных (например, массивов), поскольку стек не позволит им изменить его. Кроме того, переменные, расположенные на стеке, всегда являются локальными!
В итоге стек позволяет управлять памятью наиболее эффективным образом — но если вам нужно использовать динамические структуры данных, классы или глобальные переменные, то стоит обратить внимание на кучу.
Stack распределение в памяти происходит только во время компиляции
3.1.2.1 RAM Theme | Back To iOSWiki Contents | 3.1.2.3 Heap Theme