簡體   English   中英

限制C ++中的遞歸調用(約5000)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM