C++是否限制了递归深度?

Nar*_*rek 55 c++ recursion limit

在Python中,有一个最大的递归深度.似乎这是因为Python是一个解释器,而不是编译器.C++有相同的概念吗?或者它只与RAM限制连接?

Don*_*ows 48

C++中的限制是由于堆栈的最大大小.这通常比RAM的大小少了几个数量级,但仍然相当大.(幸运的是,像字符串内容这样的大型内容通常不会保留在堆栈本身上.)

堆栈限制通常在OS级别可调.(ulimit如果您使用的是Unix,请参阅内置shell 的文档.)此计算机(OSX)上的默认值为8 MB.

[编辑]当然,在计算你可以有多深入的时候,堆栈的大小本身并不完全有用.要知道这一点,您必须计算递归函数(也称为堆栈帧)的激活记录(或记录)的大小.最简单的方法(我知道)是使用反汇编程序(大多数调试程序的一个功能)并在每个函数的开头和结尾读出堆栈指针调整的大小.哪个很乱.(您可以通过其他方式解决这个问题 - 例如,计算两个调用中指向变量的指针之间的区别 - 但它们甚至更糟糕,特别是对于可移植代码.从反汇编中读取值更容易IMO.)

  • 仅供读者参考:您可能已经在某些圈子中看到了"激活记录",称为"堆栈框架":) (4认同)
  • 我知道我应该为单位说过MiB,但这对我来说意味着完全不同的东西.所以我会选择67.1兆比特! (2认同)
  • 在Windows机器上,您可以安全地处理堆栈溢出条件,并且B.每个可执行文件单独设置堆栈深度(它是链接器选项).由于这些功能,默认情况下,Unix机器通常使用比Windows(1MB)更深的堆栈(8MB).+1 (2认同)

Jus*_*ier 22

不,C++没有明确的递归深度.如果超出最大堆栈大小(在Windows上默认为1 MB),则C++程序将溢出堆栈并终止执行.

  • 是的.+1.此外,重要的是要注意终止是即时的 - 类似于调用TerminateProcess.不会调用任何进程的良好关闭功能(即DLL_PROCESS_DETACH,DLL_THREAD_DETACH等). (4认同)
  • 绝对 - 这是终止程序的一种更糟糕的方式. (4认同)

Mik*_*one 6

C或C++标准中没有递归深度跟踪或限制.在运行时,深度受到堆栈增长的限制.