Максимальный размер стека для программы C/C +?
Я пробовал программу ниже. Цель создания этой программы - узнать больше о размерах стека.
int main()
{
int nStack[100000000];
return 0;
}
После выполнения вышеуказанного кода программа вылетает из-за огромного распределения размера стека.
Каков максимально возможный размер стека? Это исправлено для каждой программы/компьютера? Можно ли увеличить?
Я хочу знать ради знания. Если кто-нибудь может предоставить примеры на C/С++, это будет очень полезно.
Ответы
Ответ 1
Я попробовал программу ниже.
int main()
{
int nStack[519492];
cout<<"Okay!";
return 0;
}
Выход:
Okay!
Но если я увеличиваю размер массива на 1 байт, программа выйдет из строя.
int main()
{
int nStack[519493];
cout<<"Okay!";
return 0;
}
Вывод:
No output. Program crashes.
Ответ 2
Каков максимальный размер стека?
Зависит от реализации. В настоящее время на ПК типично от одного до нескольких мегабайт.
Это исправлено для каждой программы/компьютера?
Обычно он фиксируется при связывании, но стандарт не определяет, что это такое. Некоторые операционные системы могут также ограничить стеки во время выполнения (RLIMIT_STACK
в Linux, например).
Можно ли увеличить?
Это может быть возможно в зависимости от реализации. Подробнее см. Документацию вашего компоновщика. И, возможно, документация для ОС и исполняемый формат тоже.
Вы должны выделять огромные массивы, такие как динамически.
Ответ 3
Для приложений на базе Linux мы можем использовать API getrlimit и setrlimit, чтобы знать различные ограничения ресурсов ядра, такие как размер основного файла, время процессора, размер стека, хорошие значения, макс. нет. процессов и т.д. "RLIMIT_STACK" - это имя ресурса для стека, определенного в ядре linux. Ниже приведена простая программа для получения размера стека:
#include <iostream>
#include <sys/time.h>
#include <sys/resource.h>
#include <errno.h>
using namespace std;
int main()
{
struct rlimit sl;
int returnVal = getrlimit(RLIMIT_STACK, &sl);
if (returnVal == -1)
{
cout << "Error. errno: " << errno << endl;
}
else if (returnVal == 0)
{
cout << "stackLimit soft - max : " << sl.rlim_cur << " - " << sl.rlim_max << endl;
}
}
Ответ 4
Чтобы изменить размер стека, выделенного для основного потока, который был поднят загрузчиком процесса для запуска кода в его точке входа, посмотрите на документацию компоновщика. Также возможно отредактировать размер стека в метаданных исполняемого заголовка.