Дубликат Как выделить больше памяти и избежать переполнения стека при большом количестве рекурсий?
Я пишу алгоритм ветвей и границ, который имеет рекурсивную функцию по крайней мере 10000 уровней, но он не работает из-за ошибки переполнения стека. Вот простой пример моей программы на C ++:
void f(int k) { if(k==10000) return; f(k+1); } void main() { f(1); return; }
Кто-нибудь может помочь?
Это проблема компоновщика. Вам нужно будет указать компоновщику увеличить объем памяти, выделенной для стека. Это отличается для разных языков и компиляторов. Это может быть параметр командной строки, файл конфигурации или даже его можно указать в исходном коде.
Если вы работаете в Linux (может быть, на Mac тоже?), Вы можете использовать команду ulimit.
Но вы, возможно, захотите изучить оптимизацию вашего алгоритма или поиск хвостовой рекурсии.
Если вы используете _beginthreadex, вы можете указать размер стека. Я считаю, что по умолчанию 1 МБ. Вы можете выделить новый поток, чтобы выполнить свою работу, и указать любой размер стека, какой хотите.
Помимо вашего основного вопроса, вы можете использовать Valgrind и его инструмент Massif для профилирования памяти, используемой в стеке (по умолчанию куча профилей в массиве, но также может профилировать стек, если опция включена).
или вы можете переписать рекурсию в целое число.
Любой рекурсивный алгоритм может быть переписан как нерекурсивный с использованием списка. Таким образом, вы переместили проблему с размера стека на размер кучи, причем кучи обычно (намного) больше стеков потоков. Есть также флаги компоновщика размера стека, в зависимости от вашего компилятора / компоновщика и платформы