Ответ
Стек (stack) — это упорядоченная область оперативной памяти, используемая для хранения данных, время жизни которых привязано к области видимости (обычно к функции). Управление стеком осуществляется автоматически компилятором через сдвиг указателя стека (SP).
Что хранится в стеке:
- Локальные переменные (кроме
static). - Аргументы функций, передаваемые по значению.
- Адреса возврата из функций (куда передать управление после
return). - Сохраненные регистры процессора при вызове функции.
- Временные объекты (например, результаты промежуточных выражений).
Пример работы стека:
int bar(int y) { // Аргумент 'y' и адрес возврата помещаются в стек
int z = y * 2; // Локальная переменная 'z' размещается в стеке
return z; // Значение 'z' возвращается, фрейм стека функции bar очищается
}
void foo() {
int x = 5; // Локальная переменная 'x' в стеке foo
int result = bar(x); // Вызов bar: новый фрейм стека поверх старого
// После возврата из bar, её фрейм удалён, 'result' в стеке foo
} // При выходе из foo весь её фрейм стека очищается
Преимущества:
- Скорость: Выделение и освобождение памяти — это просто изменение значения регистра указателя стека.
- Предсказуемость: Время жизни объектов строго определено (LIFO).
- Когерентность кэша: Данные в стеке часто расположены близко, что хорошо для кэша процессора.
Ограничения:
- Ограниченный размер (задается ОС/компилятором, обычно ~1-8 МБ). Переполнение ведет к аварийному завершению (Stack Overflow).
- Нельзя изменить размер выделенного блока памяти.
- Не подходит для больших или динамических данных — для них используется куча (heap).