Стек используется для хранения локальных переменных, параметров функций и адресов возврата. Память выделяется и освобождается автоматически, по принципу LIFO (Last-In, First-Out).
Куча (Heap) используется для динамического выделения памяти для объектов, размер которых неизвестен во время компиляции или время жизни которых превышает область видимости, в которой они созданы. Управление памятью на куче осуществляется вручную или с помощью механизмов управления памятью (ARC в Swift, сборщик мусора в других языках).
| Признак | Стек | Куча |
|---|---|---|
| Выделение | Автоматически | Динамически (вручную или с помощью MRC/ARC) |
| Освобождение | Автоматически при выходе из области видимости | Вручную (free) или с помощью MRC/ARC |
| Размер данных | Известен во время компиляции | Может быть неизвестен до выполнения |
| Доступ | Быстрый, последовательный | Медленнее, произвольный |
| Структура | LIFO | Граф объектов |
| Примеры | Локальные переменные, параметры функций | Объекты классов, структуры с переменным размером |
swift