Подтвердить что ты не робот

Максимальный размер стека для программы C/C +?

Я пробовал программу ниже. Цель создания этой программы - узнать больше о размерах стека.

int main()
{
    int nStack[100000000];
    return 0;
}

После выполнения вышеуказанного кода программа вылетает из-за огромного распределения размера стека. Каков максимально возможный размер стека? Это исправлено для каждой программы/компьютера? Можно ли увеличить?

Я хочу знать ради знания. Если кто-нибудь может предоставить примеры на C/С++, это будет очень полезно.

4b9b3361

Ответ 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

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