5

VC ++(32ビットと64ビット)、特に再帰でのスタックオーバーフローに関する正確な情報が必要です。デバッグモードでは、これは再帰ですぐに発生します(4500の単純な再帰関数の実行は何もしません)。ただし、リリースモードが異なるようです。私のコードまたは関数がそうだったので、最適化は何もしないコードを削除する(明らかに再帰を削除する)ので、理解するのは難しく、私は今までにそれをテストしませんでした..私はもっとやるべきです..私は測定します最適化されたリリースの適切なタイミングで、再帰によって実装されたより複雑なクイックソートで最適化が同じことを行うかどうかわかりませんか?

ありがとう!

4

4 に答える 4

7

アンドレアスブリンクが彼の関連する答えで述べているように

VC++ではデフォルトのスタックサイズは1MBだと思います。したがって、再帰の深さが10.000の場合、各スタックフレームは最大で100バイトになります。

このスタックサイズの制限は、次を使用して変更できます。

[プロジェクト]→[プロパティ]→[構成プロパティ]→[リンカー]→[システム]→[スタック予約サイズ]。

[プロジェクト]→[プロパティ]→[構成プロパティ]→[リンカー]→[システム]→[スタック予約サイズ]。

于 2012-12-22T09:20:56.497 に答える
1

VC ++のスタックサイズのオプションは、にあります。

Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size.
于 2012-12-22T09:24:10.690 に答える
0

たとえば、個別のスタックを使用して、すべての再帰的アルゴリズムを反復的に実行できます。

于 2012-12-22T09:22:31.420 に答える
0

スタックを増やすことはひどい考えではありませんが、スタックスペースは無限ではありません。おそらくお気づきかもしれませんが、スタックの不足は簡単に回復できません。数千レベルを再帰する再帰関数を使用する必要がある場合は、必ずスタックを増やしてください。

安全のために、最大の安全な再帰レベルをテストしてから、関数に制限を設けてください[本番コードでも、少し遅くなり、スタックスペースをより多く使用する可能性があります]。そうしないと、誰かがどこかであなたのコードをあなたが予期していなかった方法で使用し、あなたが予期したよりも再帰の数レベル深く実行されたときにクラッシュすることは間違いありません-kablam、回復の可能性はありません。

別の可能な解決策は、別のスレッドで再帰を実行することです。そのスレッドがクラッシュした場合でも、メインスレッドは、なんらかの方法でクラッシュから回復できます(他に何もない場合は、コードがクラッシュしたという事実を記録するだけです。スタックが失敗し、その状況はどうでしたか)。

私は確かに、非再帰的、または少なくとも制限された再帰レベルを持ち、動的に割り当てられたlifoデータ構造などの他のメカニズムを使用して、「現在の場所」を記録することを望んでいます。

于 2012-12-22T12:13:14.387 に答える