[英]Limit recursive calls in C++ (about 5000)?
為了知道C ++中遞歸調用的限制,我嘗試了這個函數!
void recurse ( int count ) // Each call gets its own count
{
printf("%d\n",count );
// It is not necessary to increment count since each function's
// variables are separate (so each count will be initialized one greater)
recurse ( count + 1 );
}
當計數等於4716時,該程序停止! 所以限制只有4716 !! 我有點困惑!! 為什么程序在計數等於4716時停止執行!! PS:在Visual Studio 2010下執行。謝謝
遞歸調用的限制取決於堆棧的大小。 C ++語言不限制這一點(從內存來看,符合標准的編譯器需要支持多少函數調用的下限,這是一個非常小的值)。
是的,“無限”遞歸會在某個時刻停止。 我不完全確定你還有什么期望。
值得注意的是,設計軟件進行“無限”遞歸(或者運行成數百或數千次的遞歸)是一個非常糟糕的主意。 沒有(標准)方法來找出堆棧的限制,並且無法從堆棧溢出崩潰中恢復。
您還會發現,如果添加一個數組或其他數據結構[並使用它,因此它不會被優化],遞歸限制會降低,因為每個堆棧幀在堆棧上使用更多空間。
編輯:我實際上會期望更高的限制,我懷疑你是在調試模式下編譯代碼。 如果你在發布模式下編譯它,我希望你得到幾千個,甚至可能無窮無盡,因為編譯器會將你的尾遞歸轉換為循環。
堆棧大小取決於您的環境。
例如,在* NIX中,您可以修改環境中的堆棧大小,然后運行程序,結果將不同。
在Windows中,您可以這樣更改它(源) :
$ editbin /STACK:reserve[,commit] program.exe
你可能已經沒有堆棧空間了。
每次調用遞歸函數時,它都需要在堆棧上推送一個返回地址,以便它知道在函數調用之后返回的位置。
它在4716崩潰,因為它恰好在大約4716次迭代后耗盡了堆棧空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.