C++中具有 100000 个递归调用的运行时错误
Runtime errror with 100000 recursive calls in C++
我试图在 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
不再被编译为递归函数
相关文章:
- 返回递归调用和仅递归调用的区别
- 使用静态变量的递归调用的不同输出
- 复制构造函数中的递归调用
- 为什么编译器将其解析为函数指针而不是递归调用?
- 如何在 c++ 的类中递归调用函数方法?
- 了解使用堆栈实现队列的递归调用机制
- 如何通过函数指针递归调用类成员函数?
- 条件加倍时的递归调用
- 对可变参数函数的递归调用的链接器错误
- 将多个非原始递归调用转换为迭代解决方案
- 分段错误(核心转储)错误C++递归调用
- 无全局变量或功能参数的递归调用
- 在递归DP中,通过存储变量来分解递归调用:效率低下
- C - 为什么合并函数在递归调用后会逆转数组
- 递归调用中出现错误"[Error] expression list treated as compound expression in initializer [-fpermissive]"
- C / SFML:使用两个递归调用在屏幕上打印凸形形状仅显示第一个递归调用中的形状,而不是第二个
- C++中具有 100000 个递归调用的运行时错误
- 递归调用可变参数模板函数重载时的不明确调用
- 如何在 c++ 中递归调用类
- 带有两个递归调用的递归算法的时间复杂性