Ответ
Стек и куча — это разные области оперативной памяти с принципиально разными моделями управления.
| Аспект | Стек (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' автоматически освобождается здесь
Практическое правило: Используйте стек для небольших, короткоживущих данных. Используйте кучу для данных, чей размер или время жизни неизвестны на этапе компиляции.