我尝试在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。 这种奇怪行为背后的原因是什么?
答案 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
不再编译为递归函数