我有這樣的遞回方法,它不包含任何變數。為什么會拋出堆疊溢位例外?
class MainClass
{
static void Main() => Bark();
static void Bark() { Bark(); }
}
在上面的例子中,我沒有創建任何變數。如果我創建任何變數(作為引數或在方法內部),那么這是可以理解的:在執行緒的堆疊中創建了許多變數,由于記憶體不足,我收到錯誤訊息。
不明白,是不是方法本身也是存入堆疊的?為什么我收到錯誤?
uj5u.com熱心網友回復:
如果您要除錯這段代碼并查看“呼叫堆疊”視窗,那么您會看到它嘗試將Bark無限次添加到呼叫堆疊中,因為遞回沒有終點。
uj5u.com熱心網友回復:
堆疊幀不僅包含引數,還包含回傳地址,以便處理器知道回傳到哪里。
此外,隱藏this指標也是一個引數。要洗掉它,您需要一個static函式。
還有一個ebp或其他堆疊幀指標,可以在每次呼叫時將其壓入堆疊,具體取決于確切的呼叫約定。
所以,你做什么,你將肯定在某些時候得到一個堆疊溢位,除非編譯器決定執行尾遞回。
uj5u.com熱心網友回復:
我相信您期望看到的是尾遞回。不幸的是,C# 編譯器不支持它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/364135.html
