## Стек

1. [Programming Concepts: The Stack and the Heap](https://thecodeboss.dev/2014/10/programming-concepts-the-stack-and-the-heap/)
2. [Визуализация работы Stack](https://www.youtube.com/watch?v=95_CAUC9nvE&ab_channel=DeepuKSasidharan)

Стек — это область оперативной памяти (RAM/ОЗУ), которая создаётся для каждого потока. Он работает в порядке LIFO (Last In, First Out), то есть последний добавленный в стек кусок памяти будет первым в очереди на вывод из стека. 

Каждый раз, когда функция объявляет новую переменную/ссылку на класс/функции, она добавляется в стек, а когда эта переменная пропадает из области видимости (например, когда функция заканчивается), она автоматически удаляется из стека.

![stack](https://www.installsetupconfig.com/win32programming/processtoolhelpapis12_files/winprocesstoolhelpapiscode003.png)

! Стек предназначен для хранения значимых типов ([value type](/5%20Swift/5.3%20DataRepresentations/5.3.1%20DataTypes/5.3.1.4%20ValueTypes/)) и ссылок на ссылочные типы ([reference type](/5%20Swift/5.3%20DataRepresentations/5.3.1%20DataTypes/5.3.1.3%20ReferenceTypes/)).

> Стек обычно никогда не фрагментирован (наверное можно придумать реализации стека с фрагментацией, но это оксюморон)

> Когда заводим переменную в стеке, то переменная доступна только во время жизни потока

Из-за такой природы стека управление памятью оказывается весьма логичным и простым для выполнения на ЦП; Стек еще и быстрее потому, что у него единственный параметр с которым работает - это указатель положения стека (обычно регистр) - поэтому все операции со стеком работают в разы быстрее чем с кучей. Операция извлечения/записи из стека это 1 телодвижение процессора `POP`/`PUSH`.

Тем не менее, у такой строгой формы управления есть и недостатки. Размер стека — это фиксированная величина, и превышение лимита выделенной на стеке памяти приведёт к переполнению стека. Размер задаётся при создании потока ([кратный 4KB](https://developer.apple.com/documentation/foundation/nsthread/1415190-stacksize)), и у каждой переменной есть максимальный размер, зависящий от типа данных. Это позволяет ограничивать размер некоторых переменных (например, целочисленных), и вынуждает заранее объявлять размер более сложных типов данных (например, массивов), поскольку стек не позволит им изменить его. **Кроме того, переменные, расположенные на стеке, всегда являются локальными!**

В итоге стек позволяет управлять памятью наиболее эффективным образом — но если вам нужно использовать динамические структуры данных, классы или глобальные переменные, то стоит обратить внимание на кучу.

> Stack распределение в памяти происходит только во время компиляции

---

[3.1.2.1 RAM Theme](./3.1.2.1%20RAM.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [3.1.2.3 Heap Theme](./3.1.2.3%20Heap.md)