Подтвердить что ты не робот

Как изменить размер стека для .NET-программы?

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

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

P.S. Я использую 32-разрядные winXP и 64-разрядные win7.

4b9b3361

Ответ 1

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

using System.Threading;

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

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

EDITBIN.EXE /STACK:<stacksize> file.exe

Ответ 2

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

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

Ответ 3

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

Ответ 4

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