try-catchブロックはパフォーマンスを低下させますか?[重複] 質問する

try-catchブロックはパフォーマンスを低下させますか?[重複] 質問する

これリンク州、

例外をキャッチするには、コードの一部を例外検査の対象にする必要があります。これは、そのコード部分を try ブロックで囲むことによって行われます。そのブロック内で例外的な状況が発生すると、例外がスローされ、制御が例外ハンドラーに渡されます。例外がスローされない場合は、コードは通常どおり続行され、すべてのハンドラーは無視されます。

try ブロックがあると、実行時に「検査」という追加タスクが発生するため、パフォーマンスが低下するということでしょうか?

ベストアンサー1

要約いいえ例外は通常より速い例外のない道エラーコード処理と比較して。


まあ、明らかな発言は何と比べて?

エラーを処理しない場合と比較すると、明らかにパフォーマンスが低下しますが、パフォーマンスは正確性の欠如に見合う価値があるでしょうか? 私はそうではないと主張しますif。したがって、ステートメントでチェックされたエラー コードと比較することを意味していると仮定しましょう。

この場合、状況によります。例外を実装するために使用されるメカニズムは複数あります。実際には、ステートメントに非常に近いメカニズムを使用して実装できるifため、コストは同じ (またはわずかに高い) になります。

しかしC++では、すべての主要コンパイラ(gccは4.xシリーズで導入し、MSVCは64ビットコードで使用)がゼロコスト例外モデルを使用しています。これを読んでいると、技術論文Need4Sleepがリンクしているこのアプローチは、テーブル駆動型アプローチとしてリストされています。このアプローチは、プログラムの各ポイントで問題が発生する可能性がある場合に、適切なcatch節を見つけるのに役立ついくつかの情報をサイドテーブルに登録するというものです。正直なところ、実装の面では古い戦略よりも少し複雑ですが、ゼロコスト名前の由来は、無料例外が投げられないようにする。これをCPUの分岐予測ミスと比較すると、例外が投げられた場合のペナルティは大きい。なぜならテーブルはコールド ゾーンに保存されます (そのため、RAM へのラウンドトリップが必要になるか、さらに悪い状況になる可能性があります)... ただし、例外は例外です。

要約すると、最新の C++ コンパイラでは、例外はエラー コードよりも高速ですが、バイナリが大きくなります (静的テーブルのため)。


徹底的な対策として、3 番目の選択肢として中止があります。ステータスまたは例外を介してエラーを伝播する代わりに、プロセスを中止することができます。これは限られた状況でのみ適していますが、どちらの選択肢よりも最適化されます。

おすすめ記事