2017-11-19 14 views
-3

CygwinのC++ 14とWindows 10のMingwでこのコードを実行しようとしましたが、両方ともランタイムエラーが発生しています。しかし、Ubuntu 16.04では問題なく動作します。C++の100000回帰呼び出しでランタイムエラーが発生する

#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 ; 
} 

しかし、私は^ 4 10にいくつかの番号にkの値を変更した場合には、この奇妙な行動の背後にある理由は何ができるか= 12345 Kのような窓10、上でも動作しますか?

+1

各再帰呼び出しにはいくらかのメモリが必要なため、実行環境にはあまりにも多くのものがあります。そのため、深い再帰を避ける必要があります。 – StoryTeller

+1

スタックサイズが制限されています。明らかに。 – iBug

+1

スタックが爆発しています。 – Ron

答えて

0

コールスタックは実際には限られており、その制限はコンピュータとOSによって異なります(Windowsでは1メガバイト、Linuxでは8メガバイト)。

Linuxでsetrlimit(2)を使用して、コールスタックのサイズを変更することができます(たとえば、シェルにulimitが組み込まれている)。

コンパイラに最適化を依頼する場合、たとえば、 g++ -O3 -fverbose-asm -Sでコンパイルすると、recは再帰関数としてコンパイルされなくなることがわかります

1

各再帰関数呼び出しは、スタック内のスペースを占有します。異なるOSはRAMを別々に管理します.Windows 10では、Ubuntuが維持しているスタックと同じ大きさのスタックを維持していないことは明らかです。たぶん、スタックのサイズを調整する方法がありますが、私はWindowsについてはわかりません。

関連する問題