2012-05-13 26 views
5

我們都知道創建小型方法來促進重用是一個很好的做法,這不可避免地會導致很多方法被放置在堆棧上。但是,是否有可能達到有太多嵌套方法調用發生StackOverflow異常的場景?堆棧大小和溢出可能有太多的方法嗎?

接受的解決方案是簡單地增加堆棧大小嗎?

documentation states在「非常深的或無限的遞歸」期間會發生這樣的異常,所以它肯定似乎是可能的,還是.NET框架可以動態地爲我們處理堆棧大小?

我的問題可以概括如下所示:

是否有可能有這樣一個精心設計的程序(小型可重複使用的方法 而言)是變得necassary增加 堆棧大小,因此使用更多資源?

回答

2

不是。我只做了一個非常快速的測試,並且在15,000個嵌套調用後出現StackOverflowException。

由於您擁有的方法數量衆多,您無法編寫非遞歸嵌套15,000次的代碼。

很明顯,確切數量取決於您在堆棧上分配的許多函數局部變量。但無論實際數量如何,都遠遠不夠你做你的建議。

3

.NET堆棧大小是固定的,默認情況下是1MB。

是否有可能有這樣一個設計良好的程序(在小的可重用的方法方面)變得需要增加堆棧大小,從而使用更多的資源?

它不會將你的邏輯分解成方法。

您會遇到不是直接錯誤的堆棧溢出的唯一方法是遞歸。當這種情況發生時(威脅),不要增加堆棧,而是重寫代碼以使用不同的方式來存儲數據(如Stack<T>)。

0

在託管的世界中,棧具有特殊的性能角色。如果你設法在棧上分配一些東西(使用原語或結構),你不必把它放在堆上。在堆上分配會增加平均減慢程序速度的GC壓力。

因此,我可以通過在堆棧上分配大量內容來更快地映像程序。即使使用stackalloc(這是C#/ CLR的鮮爲人知的功能)。

有這樣的有效情況。他們很少見。只是說「沒有有效的用途」顯然是錯誤的。

+0

你確定你正在回答正確的問題嗎? –

+0

@ MahmoudAl-Qudsi - 我同意,這不是我問的 –

+0

@ m.edmondson,你能詳細說明你想知道的嗎?我回答了你在最後一段提出的問題:是否有正當的理由來編程,需要增加堆棧大小。我給出了原因。我誤解了什麼? – usr