2012-12-22 61 views
5

我想要在VC++(32位和64位),特別是在遞歸堆棧溢出的準確信息。在調試模式下,這種情況在遞歸中很快就會發生(就像一個簡單遞歸函數的4500運行不要做任何事情或類似的事情)。但是,似乎發佈模式是不同的。這很難理解,而且我現在也沒有測試它,因爲優化會刪除不執行任何操作的代碼(顯然會刪除遞歸),因爲我的代碼或函數是如此..我應該做更多..我測量在優化發佈的正確時間,我不知道是否優化在更復雜的快速排序實現遞歸?VC++中棧的大小是多少?

謝謝!

回答

7

作爲安德烈亞斯Brinck states in his related answer

在VC默認堆棧大小爲1 MB我想,所以用一個遞歸 深度10.000每個堆棧幀可以是至多約100個字節。

項目→屬性→配置屬性→鏈接→系統→堆棧保留大小:

這個堆棧大小限制可使用被修改。

Project → Properties → Configuration Properties → Linker → System → Stack Reserve Size.

+0

它的工作,謝謝,它需要重新配置後。 謝謝! – user683595

+0

不客氣!不要忘記接受答案。聖誕節快樂!! –

+0

第一段從[C/C++程序的最大堆棧大小](http://stackoverflow.com/q/1825964)逐字拷貝 –

0

你可以做所有的遞歸算法迭代例如與獨立的堆棧。

1

在VC堆棧大小++位於選項,

Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size. 
0

雖然增加堆棧是不是一個可怕的想法,stackspace不是無限的,正如你可能已經注意到,用完棧不容易恢復。如果你必須使用遞歸幾千個級別的遞歸函數,那麼通過所有方法來增加堆棧。

爲了安全起見,請確保您測試最大安全遞歸級別,然後在您的函數中有一個限制[即使在生產代碼中,即使它稍微慢一點,可能會佔用更多堆棧空間] 。否則,你可以打賭某個人在某種程度上會以你沒有預料到的方式使用你的代碼,並且當它在遞歸中比你預期的深入幾級時發生崩潰 - kablam,沒有可能的恢復。

另一個可能的解決方案是在一個單獨的線程中運行遞歸,如果該線程崩潰,您仍然有主線程以某種理智的方式從崩潰中恢復(如果沒有別的,只需記錄事實代碼崩潰,堆棧失敗,以及情況如何)。

我當然希望有一個非遞歸或至少有限的遞歸級別,並使用其他機制,如動態分配的lifo數據結構來記錄「我們在哪裏」。