2010-03-31 92 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