Есть ли предел на стековую память?

Я проходил один из потоков. Программа отказала, потому что она объявила массив 10^6 локально в функции.

Приведенной причиной был сбой выделения памяти на стеке, ведет для катастрофического отказа.

когда тот же массив был объявлен глобально, он работал хорошо. (память на "куче" сохранила его).

Теперь в настоящий момент давайте предположим, стек становится нисходящим и "куча" вверх.

Мы имеем:

---СТЕК---

-------------------

---"КУЧА"----

Теперь, я полагаю, что, если существует отказ в выделении на стеке, это должно перестать работать на "куче" также.

Таким образом, мой вопрос: есть ли предел на размер стека? (пересечение предела заставило программу отказывать). Или я пропускаю что-то?

9
задан user207421 15 March 2016 в 23:12
поделиться

5 ответов

Все зависит от того, какой язык и какой компилятор вы используете. Но программы, скомпилированные, например, на C или C ++, выделяют стек фиксированного размера при запуске программы. Размер стека обычно можно указать во время компиляции (в моем конкретном компиляторе он по умолчанию равен 1 МБ).

5
ответ дан 4 December 2019 в 11:04
поделиться

Да, стек всегда ограничен. В некоторых языках/компиляторах вы можете установить запрашиваемый размер.

Обычно значения по умолчанию (если не заданы вручную) составляют около 1MB для текущих языков, что достаточно, если вы не делаете что-то, что обычно не рекомендуется (например, выделяете огромные массивы на стеке)

6
ответ дан 4 December 2019 в 11:04
поделиться

Возможно, это не очень хороший ответ, но он дает вам более глубокое представление о том, как windows в целом управляет памятью: Pushing the Limits of Windows

1
ответ дан 4 December 2019 в 11:04
поделиться

Вы не указываете, какой язык программирования, но в Delphi параметры компиляции включают максимальный и минимальный размер стека, и я считаю, что аналогичные параметры будут существовать для всех компилируемых языков.

Мне, конечно, приходилось иногда увеличивать максимум.

2
ответ дан 4 December 2019 в 11:04
поделиться

Да, для большинства языков существует ограничение на размер стека. Например, в C / C ++, если у вас есть неправильно написанная рекурсивная функция (например, неправильный базовый случай), вы переполните стек. Это связано с тем, что, игнорируя хвостовую рекурсию , каждый вызов функции создает новый стековый фрейм , который занимает место в стеке. Сделайте это достаточно, и у вас закончится место.

Запуск этой программы C в Windows (VS2008) ...

void main()
{
    main();
}

... приводит к переполнению стека:

Необработанное исключение по адресу 0x004113a9 в Stack.exe: 0xC00000FD: Переполнение стека.

1
ответ дан 4 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: