2016-05-30 11 views
1

私はC#でいくつかのコードを書いていましたが、何千もの呼び出しの後でスタックオーバーフローの例外を引き起こした再帰的な方法がありました。
しばらくすると、私はC++で同じコードを書いてしまいました。実際の再帰呼び出し回数はC#が停止した場所の約10倍ですが、例外なく正常に動作しました。
これを処理する上でC#とC++の違いは何ですか?そして、例外がスローされることなく、C#でより多くの再帰呼び出しを許可できる方法はありますか?スタックオーバーフロー例外C++とC#の違い

+3

異なるスタックサイズ?スタックに置かれる変数の大きさの違いは?どのようにスタックサイズを増やすかについては、ここで例を読む:http://stackoverflow.com/a/823729/5311735 – Evk

+0

コードなしでは難しいがC++はテールコール最適化が可能で、AFAIK C#は – user6144226

答えて

6

C#とC++でのstackoverflowの最も顕著な違いは、次のとおりです。C++には「スタックオーバーフロー例外」(*)がありません。 C++でスタックをオーバーフローさせた結果は、未定義の動作に過ぎません。それはあなたが期待していることをするかもしれませんが、まったく異なる何かをするかもしれません。運が良ければ、プログラムがクラッシュし(スタックの最後に保護されたページが割り当てられているためにセグメンテーション違反が発生します)、不運になるとスタックオーバーフローは検出されません。ある時点で上書きされたメモリにアクセスしようとするまで。再帰呼び出しに織り込むこと

他のもの:

  1. 可能なスタックサイズが異なる場合があります。
  2. 使用されているスタックフレームのサイズが異なる可能性があります。
  3. テール再帰の最適化は、あるケースでは実行できますが、他のケースでは実行できません。
  4. システムによっては、スタックを動的に増やすことができます(「スプリットスタック」)。

(*)動作が未定義であるため、実装によっては、stackoverflow例外が定義され、適切な条件の下でスローされることがあります。しかし、そのような保証はありません。

+0

ではない(*)、私は非常に賢明にスタックオーバーフローで "メモリ不足"の例外を与えるアプリケーションを見てきました。 – Nyerguds

関連する問題