运行时错误,在C ++中有100000个递归调用

时间:2017-11-19 11:44:22

标签: c++ recursion windows-10 runtime-error ubuntu-16.04

我尝试在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。 这种奇怪行为背后的原因是什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

您可以在Linux上使用setrlimit(2)来更改调用堆栈的大小(例如,在shell中内置def wrap[T <: MyWrapperBound](message: String): T = macro ... )。

如果您要求编译器进行优化,例如使用ulimit进行编译,您将看到g++ -O3 -fverbose-asm -S不再编译为递归函数