В чем разница между стеком (stack) и кучей (heap) в управлении памятью?

«В чем разница между стеком (stack) и кучей (heap) в управлении памятью?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Стек и куча — это разные области оперативной памяти с принципиально разными моделями управления.

Аспект Стек (Stack) Куча (Heap)
Управление Автоматическое (LIFO). Компилятор выделяет/освобождает память при входе/выходе из области видимости (функции). Ручное или через сборщик мусора (GC/ARC). Программист запрашивает выделение (malloc, new) и отвечает за освобождение (free, delete).
Скорость Очень высокая. Выделение — простое перемещение указателя стека. Относительно медленная. Требуется поиск свободного блока и синхронизация в многопоточных средах.
Размер Ограничен (обычно несколько МБ). Переполнение приводит к crash (Stack Overflow). Большой, ограничен объемом всей доступной ОЗУ.
Типы данных Локальные переменные, аргументы функций, указатели на объекты в куче. Динамически создаваемые объекты, большие массивы данных, всё, что должно жить дольше вызова функции.
Фрагментация Отсутствует. Возможна, требует дефрагментации.

Пример на C:

void example() {
    int onStack = 42; // Переменная в стеке
    int *onHeap = (int*)malloc(sizeof(int)); // Память выделена в куче
    *onHeap = 100;
    free(onHeap); // Обязательно освободить!
} // 'onStack' автоматически освобождается здесь

Практическое правило: Используйте стек для небольших, короткоживущих данных. Используйте кучу для данных, чей размер или время жизни неизвестны на этапе компиляции.