2013-01-14 29 views
1

xDebug上,它們限制了一個函數可以嵌套的次數,嵌套函數有多少缺點?超級嵌套函數的缺點?

+2

難道它不正確嗎?爲了防止無限遞歸?如果你手動嵌套這些函數,並且你需要嵌套超過100次,那麼你做錯了。 –

回答

2

是的。

每次從另一個函數內調用某個函數時,都會向堆棧添加一個級別。

過去的函數調用還沒有返回,所以他們聲明的局部變量的內存不能被釋放;它仍然是居民,直到整個堆棧被解開。

想象一下,您將從函數內調用1000個調用深度來拋出異常。爲了生成堆棧跟蹤,它必須向上遍歷1,000次函數調用,將它們全部放入異常對象中。

你可以用遞歸來做任何事情,你不能用一個寫得好的循環來做深層的事情,而且循環會更有效率地存儲內存(因爲它不必擁有棧幀開銷對於每個函數調用)和時間效率(因爲它沒有實際執行函數調用的開銷)。

達到1,000遞歸級別的程序的行爲如預期是極不可能的。更可能的是,它陷入了無限遞歸,並最終耗盡了所有系統的RAM。最好早點殺死它。