C++中具有 100000 个递归调用的运行时错误

Runtime errror with 100000 recursive calls in C++

本文关键字:递归 调用 运行时错误 100000 C++      更新时间:2023-10-16

我试图在 Windows 10 中的 Cygwin 和 Mingw 上运行 C++14 中的这段代码,但在两者都出现运行时错误。但是在 Ubuntu 16.04 上,它可以毫无问题地运行。

#include <iostream>
using namespace std;
int rec(int n){
    if(n == 0) return 0; 
    return 1 + rec(n-1); 
}
int main(){
    int k = 123456;
    cout << rec(k) << endl; 
    return 0 ;
}

但是如果我将 k 的值更改为 10^4 中的某个数字,它甚至可以在 windows 10 上工作,例如 k = 12345。这种奇怪行为背后的原因可能是什么?

每个递归函数调用都会占用堆栈中的一些空间。不同的操作系统管理RAM的方式不同,很明显,Windows 10没有维护一个像Ubuntu维护的堆栈一样大的堆栈。也许有一种方法可以调整堆栈大小,但我不确定Windows。

调用堆栈确实是有限的,其限制取决于计算机和操作系统(仅作为经验法则:Windows上为1兆字节,Linux上为8兆字节(。

在 Linux 上,你可以使用 setrlimit(2( 来改变调用堆栈的大小(例如,在 shell 中内置ulimit(。

如果你要求编译器进行优化,例如用g++ -O3 -fverbose-asm -S编译,你会看到rec不再被编译为递归函数