1

xDebug 上,它们限制了一个函数可以嵌套多少次,嵌套函数这么多次有什么缺点吗?

4

1 回答 1

3

是的。

每次从另一个函数中调用一个函数时,都会向堆栈添加一层。

过去的函数调用还没有返回,所以他们为局部变量申请的内存不能被释放;它一直驻留,直到整个堆栈展开。

想象一下,您要从 1,000 次调用深度的函数内部抛出异常。为了生成堆栈跟踪,它必须向上遍历 1,000 个函数调用,将它们全部放入异常对象中。

递归没有什么可以做的,而使用编写良好的循环则无法做到,并且循环将更节省内存(因为它不必为每个函数调用产生堆栈帧开销)和时间效率(因为它没有实际执行您删除的函数调用的开销)。

递归级别达到 1,000 的程序极不可能按预期运行。更有可能的是,它陷入了无限递归,最终会耗尽系统的所有 RAM。最好早点杀掉。

于 2013-01-14T18:01:05.583 回答