私はC#でいくつかのコードを書いていましたが、何千もの呼び出しの後でスタックオーバーフローの例外を引き起こした再帰的な方法がありました。
しばらくすると、私はC++で同じコードを書いてしまいました。実際の再帰呼び出し回数はC#が停止した場所の約10倍ですが、例外なく正常に動作しました。
これを処理する上でC#とC++の違いは何ですか?そして、例外がスローされることなく、C#でより多くの再帰呼び出しを許可できる方法はありますか?スタックオーバーフロー例外C++とC#の違い
1
A
答えて
6
C#とC++でのstackoverflowの最も顕著な違いは、次のとおりです。C++には「スタックオーバーフロー例外」(*)がありません。 C++でスタックをオーバーフローさせた結果は、未定義の動作に過ぎません。それはあなたが期待していることをするかもしれませんが、まったく異なる何かをするかもしれません。運が良ければ、プログラムがクラッシュし(スタックの最後に保護されたページが割り当てられているためにセグメンテーション違反が発生します)、不運になるとスタックオーバーフローは検出されません。ある時点で上書きされたメモリにアクセスしようとするまで。再帰呼び出しに織り込むこと
他のもの:
- 可能なスタックサイズが異なる場合があります。
- 使用されているスタックフレームのサイズが異なる可能性があります。
- テール再帰の最適化は、あるケースでは実行できますが、他のケースでは実行できません。
- システムによっては、スタックを動的に増やすことができます(「スプリットスタック」)。
(*)動作が未定義であるため、実装によっては、stackoverflow例外が定義され、適切な条件の下でスローされることがあります。しかし、そのような保証はありません。
+0
ではない(*)、私は非常に賢明にスタックオーバーフローで "メモリ不足"の例外を与えるアプリケーションを見てきました。 – Nyerguds
関連する問題
- 1. スタックオーバーフロー例外を定義してください - C#
- 2. クイックソートとスタックオーバーフローの例外
- 3. クイックソートのスタックオーバーフロー例外
- 4. Java例外とC++例外
- 5. C++:スタックオーバーフローから例外を受け取りますか?
- 6. C++例外とシグナルハンドラ
- 7. Javaでのスタックオーバーフロー例外
- 8. 自動プロパティのスタックオーバーフロー例外
- 9. クワッドツリーでのスタックオーバーフロー例外
- 10. C++/C#例外スロー
- 11. C++コールバックからC#関数へのアクセス違反例外/クラッシュ
- 12. アプリケーション例外とシステム例外の違い
- 13. 再帰のないスタックオーバーフロー例外
- 14. C#の:例外
- 15. 再帰スタックオーバーフローC++
- 16. 前にスタックオーバーフロー例外main()
- 17. C(C++ではない)の例外ライブラリ
- 18. チェックされていない例外(ex C#)とJava-esque例外との違いは何ですか?
- 19. C#スレッディングメモリ例外
- 20. C#JSON例外
- 21. C++デバッグブレーク例外
- 22. xsubpp C++例外
- 23. C#IO例外
- 24. C#例外リスナー
- 25. 例外スローエラーC
- 26. 例外、C++
- 27. .NET C/C++ P/INVOKE例外
- 28. iPhone C++/Objective-C例外
- 29. CとC++の違い(lseek())
- 30. コンソールアプリケーションのC++例外?
異なるスタックサイズ?スタックに置かれる変数の大きさの違いは?どのようにスタックサイズを増やすかについては、ここで例を読む:http://stackoverflow.com/a/823729/5311735 – Evk
コードなしでは難しいがC++はテールコール最適化が可能で、AFAIK C#は – user6144226