Как изменить размер стека для программы .NET? - PullRequest
28 голосов
/ 01 апреля 2010

У меня есть программа, которая выполняет рекурсивные вызовы 2 миллиарда раз и переполнение стека. Я делаю изменения, и тогда все еще нужны 40K рекурсивных вызовов. Поэтому мне нужно, наверное, несколько МБ стека памяти. Я слышал, что размер стека по умолчанию составляет 1 МБ. Я попробовал поискать онлайн. Кто-то сказал, чтобы перейти свойства -> компоновщик ......... в Visual Studio, но я не могу найти его.

Кто-нибудь знает, как его увеличить? Также мне интересно, могу ли я установить его где-нибудь в моей программе на C #?

P.S. Я использую 32-битный winXP и 64-битный win7.

Ответы [ 4 ]

40 голосов
/ 01 апреля 2010

Самый простой способ установить размер стека от .NET 2.0 и Win XP и далее - создать новый поток с нужным вам размером стека:

using System.Threading;

Thread T = new Thread(threadDelegate, stackSizeInBytes);
T.Start();

Чтобы изменить размер стека всей программы, вам нужно использовать editbin: -

EDITBIN.EXE /STACK:<stacksize> file.exe
17 голосов
/ 01 апреля 2010

Компилятора для этого нет. Вы можете отредактировать его по факту, используя editbin / stack , или создать отдельный поток для вашего алгоритма и указать больший размер стека в конструкторе Thread .

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

10 голосов
/ 01 апреля 2010

Скорее всего, вы должны попытаться использовать циклы вместо рекурсии.

0 голосов
/ 01 апреля 2010

Я знаю, что в VS вы можете установить произвольный размер стека (EDIT: для программ на C ++).Тем не менее, я бы предложил вам использовать хвостовой вызов (т. Е. Return MyFunc (args);), который автоматически перезаписывает пространство стека.Затем вы использовали бы некоторый объект, выделенный в куче, для хранения состояния.

...