2010-03-31 164 views
23

我有一个程序,做递归调用20亿次和堆栈溢出。我做了修改,然后它仍然需要40K递归调用。所以我需要几个MB堆栈内存。我听说堆栈大小默认为1MB。我尝试在线搜索。有人说要在视觉工作室中使用属性 - >链接器.........但我找不到它。如何更改.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

对于那些使用editbin路径的用户,需要在Visual Studio安装程序中下载Visual C++工具集。你也可以把它放在你的后期构建步骤中,作为'EDITBIN.EXE/STACK: $(TargetName)' – 2017-03-18 12:42:26

+0

@CameronAavik添加到你的评论,我需要添加SDK工具文件夹到我的路径,重新启动Visual Studio看到这个更改并使用'$(TargetPath)'而不是'$(TargetName)'。 – 2017-09-07 13:29:39

10

很可能你应该尝试使用循环代替递归。

+7

+1,20亿递归调用有点过分。 – 2010-03-31 22:37:14

+0

让我们更精确一点:问题不在于递归*本身,还是迭代次数(毕竟,转换为循环后仍然会有20亿次迭代)。真正的问题是编译器可能不会生成尾部调用;只是因为这个递归与大量的迭代相结合才会成为问题。 – stakx 2012-08-30 16:55:51

16

没有编译器选项。您可以edit it after the fact using editbin /stack,或为您的算法创建一个单独的线程,并在Thread constructor中指定较大的堆栈大小。

这就是说,你可能想要扁平化你的递归函数......如果你现在有堆栈溢出,很难知道任何堆栈大小都适合长期使用。这只是一个创可贴的解决方案。

0

我知道,在VS,你可以设置任意堆栈大小(编辑:对于C++程序)。但是,我建议你使用尾部调用(即返回MyFunc(args);),它会自动回收堆栈空间。然后,你会使用一些堆分配对象来保持状态。

+0

一般来说,我不认为.NET编译器会优化一个尾递归调用。至少,C#和VB.NET不会。 – user1172763 2016-05-31 21:26:24