Ответ
Стек (stack) — это предварительно выделенная область оперативной памяти (RAM), управляемая непосредственно процессором и ОС. Каждому потоку в приложении выделяется свой собственный стек.
Ключевые характеристики:
- Структура: LIFO (Last-In, First-Out). Данные добавляются (push) и удаляются (pop) только с вершины.
- Скорость: Очень высокая, так как операции сводятся к простому перемещению указателя стека.
- Размер: Фиксированный и ограниченный (обычно 1-8 МБ на поток в .NET, задаётся при создании потока).
- Управление памятью: Автоматическое. Память для локальных переменных выделяется при входе в метод и освобождается при выходе из него.
- Хранимые данные: Локальные переменные значений (value types), ссылки на объекты (указатели), параметры методов и адреса возврата.
Пример работы стека в C#:
void Calculate()
{
int a = 10; // Значение '10' помещается в стек
object b = new object(); // Сам объект создаётся в куче (heap),
// а ссылка на него (указатель) хранится в стеке
int result = AddFive(a); // При вызове метода в стек помещаются
// параметр 'a' и адрес возврата
}
int AddFive(int number) // При входе в метод в стеке выделяется место
{ // для параметра 'number' и локальных переменных
int localVar = number + 5; // Локальная переменная в стеке
return localVar; // При возврате память для localVar и number освобождается
}
Что происходит в куче (heap)? Там размещаются:
- Объекты ссылочных типов (классы).
- Большие структуры (struct), которые не помещаются в стек.
- Статические поля.
Ошибка StackOverflowException возникает, когда глубина вызовов методов (рекурсия) или объём локальных данных превышает выделенный размер стека.