Как я могу увеличить память стека?

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

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

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

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

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


person Community    schedule 21.05.2009    source источник
comment
См. этот тесно связанный вопрос stackoverflow.com/questions/743545/   -  person sharptooth    schedule 21.05.2009


Ответы (6)


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

person sybreon    schedule 21.05.2009

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

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

person swampsjohn    schedule 21.05.2009

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

person Remus Rusanu    schedule 21.05.2009

или вы можете переписать рекурсию в взаимодействие.

person Mladen Prajdic    schedule 21.05.2009

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

person Community    schedule 21.05.2009

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

person Community    schedule 05.06.2009