2010-03-31 16 views
23

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

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

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

ответ

32

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

using System.Threading; 

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

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

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

Для тех, кто идет по маршруту редактирования, вам необходимо загрузить набор инструментов Visual C++ в установщик Visual Studio. Вы также можете поместить его в свои шаги для сборки сообщений как «EDITBIN.EXE/STACK: $ (TargetName)' –

+0

@CameronAavik. Добавляя к вашим комментариям, мне нужно было добавить папку инструментов SDK в свой путь, перезапустить Visual Studio, чтобы увидеть это изменить и использовать '$ (TargetPath)' вместо '$ (TargetName)'. –

10

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

+7

+1, 2 миллиарда рекурсивных вызовов немного чрезмерны. –

+0

Давайте немного уточним: проблема заключается не столько в рекурсии * per se *, сколько в количестве итераций (в конце концов, после преобразования в цикл все равно будет 2 миллиарда итераций). Реальная проблема заключается в том, что компилятор может не генерировать хвостовые вызовы; только из-за этого рекурсия в сочетании с большим количеством итераций становится проблематичной. – stakx

16

Для этого нет возможности компилятора. Вы можете указать edit it after the fact using editbin /stack или создать отдельный поток для своего алгоритма и указать размер большего размера в Thread constructor.

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

0

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

+0

В общем, я не думаю, что компиляторы .NET оптимизируют хвостовой рекурсивный вызов. По крайней мере, C# и VB.NET этого не делают. – user1172763

Смежные вопросы