Как я могу увеличить память стека? - PullRequest
0 голосов
/ 21 мая 2009

Дубликат Как выделить больше памяти и избежать переполнения стека при большом количестве рекурсий?

Я пишу алгоритм ветвей и границ, который имеет рекурсивную функцию по крайней мере 10000 уровней, но он не работает из-за ошибки переполнения стека. Вот простой пример моей программы на C ++:

void f(int k)
{
   if(k==10000) return;
   f(k+1);
} 

void main()
{
   f(1);
   return;
}

Кто-нибудь может помочь?

Ответы [ 6 ]

4 голосов
/ 21 мая 2009

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

2 голосов
/ 21 мая 2009

Если вы работаете в Linux (может быть, на Mac тоже?), Вы можете использовать команду ulimit.

Но вы, возможно, захотите изучить оптимизацию вашего алгоритма или поиск хвостовой рекурсии.

0 голосов
/ 05 июня 2009

Если вы используете _beginthreadex, вы можете указать размер стека. Я считаю, что по умолчанию 1 МБ. Вы можете выделить новый поток, чтобы выполнить свою работу, и указать любой размер стека, какой хотите.

0 голосов
/ 21 мая 2009

Помимо вашего основного вопроса, вы можете использовать Valgrind и его инструмент Massif для профилирования памяти, используемой в стеке (по умолчанию куча профилей в массиве, но также может профилировать стек, если опция включена).

0 голосов
/ 21 мая 2009

или вы можете переписать рекурсию в целое число.

0 голосов
/ 21 мая 2009

Любой рекурсивный алгоритм может быть переписан как нерекурсивный с использованием списка. Таким образом, вы переместили проблему с размера стека на размер кучи, причем кучи обычно (намного) больше стеков потоков. Есть также флаги компоновщика размера стека, в зависимости от вашего компилятора / компоновщика и платформы

...