У меня есть программа, которая делает рекурсивные вызовы в течение 2 миллиардов раз и переполнения стека. Я вношу изменения, и затем этому все еще нужны 40K рекурсивные вызовы. Таким образом, мне нужны, вероятно, несколько МБ стековой памяти. Я слышал, что размер стека является значением по умолчанию к 1 МБ. Я попробовал поиск онлайн. Кто-то сказал для движения свойств-> компоновщик......... в Visual Studio, но я не могу найти его.
Кто-либо знает, как увеличить его? Также я задаюсь вопросом, могу ли я установить его где-нибудь в моей программе C#?
P.S. Я использую 32-разрядный winXP и 64 бита win7.
Самый простой способ установить размер стека начиная с .NET 2.0 и Win XP - это создать новый поток с желаемым размером стека: -
using System.Threading;
Thread T = new Thread(threadDelegate, stackSizeInBytes);
T.Start();
Чтобы изменить размер стека всей программы, вы должны использовать editbin: -
EDITBIN.EXE /STACK:<stacksize> file.exe
Компилятор не может это сделать. Вы можете отредактировать его постфактум, используя editbin / stack , или создать отдельный поток для вашего алгоритма и указать больший размер стека в конструкторе Thread .
При этом вы можете захотеть сгладить свою рекурсивную функцию ... Если у вас сейчас переполнение стека, трудно знать, что любой размер стека будет подходящим в долгосрочной перспективе. Это просто пластырь.
Скорее всего, вам следует попробовать использовать циклы вместо рекурсии.
Я знаю, что в VS вы можете установить произвольный размер стека (EDIT: для программ на C ++). Однако я бы посоветовал вам использовать хвостовой вызов (т.е. return MyFunc (args);), который автоматически перерабатывает пространство стека. Затем вы должны использовать какой-нибудь объект, выделенный кучей, для хранения состояния.