限制C++中的递归调用(约5000)?

sat*_*res 5 c++ recursion

为了知道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 );
}
Run Code Online (Sandbox Code Playgroud)

当计数等于4716时,该程序停止!所以限制只有4716 !! 我有点困惑!! 为什么程序在计数等于4716时停止执行!! PS:在Visual Studio 2010下执行.谢谢

Mat*_*son 11

递归调用的限制取决于堆栈的大小.C++语言不限制这一点(从内存来看,符合标准的编译器需要支持多少函数调用的下限,这是一个非常小的值).

是的,"无限"递归会在某个时刻停止.我不完全确定你还有什么期望.

值得注意的是,设计软件进行"无限"递归(或者运行成数百或数千次的递归)是一个非常糟糕的主意.没有(标准)方法来找出堆栈的限制,并且无法从堆栈溢出崩溃中恢复.

您还会发现,如果添加数组或其他数据结构[并使用它,因此它不会被优化],递归限制会降低,因为每个堆栈帧在堆栈上使用更多空间.

编辑:我实际上会期望更高的限制,我怀疑你是在调试模式下编译代码.如果你在发布模式下编译它,我希望你得到几千个,甚至可能无穷无尽,因为编译器会将你的尾递归转换为一个循环.

  • @Satyres:如果你在"发布"而不是调试中编译,我希望它会更大.在调试模式下,编译器添加额外的"虚拟"堆栈空间来检测堆栈覆盖,这使得每个堆栈帧大约200字节(200*接近5000 = 1MB,所以有一定意义),没有它,堆栈帧应该只是关于4-16个字节,你应该可以做更多.也许你必须关闭其他一些功能 - 自从我上次使用visual studio以来已经有一段时间了...... (2认同)