web-dev-qa-db-ja.com

例外がスローされない場合、C ++例外はどのようにコードを遅くしますか?

たとえば、戻り値をチェックするのではなく、例外処理にC++例外を使用することにはオーバーヘッドがあることを読みました。例外がスローされない場合に発生するオーバーヘッドについてのみ話します。また、実際に戻り値をチェックして適切なことを行うコードを実装する必要があると想定しています。これは、catchブロックが実行するのと同等の処理です。また、内部に45の状態変数を持つ例外オブジェクトをスローするコードを、すべてのエラーに対して負の整数を返すコードと比較することも公平ではありません。

私は、どちらがより速く実行されるかだけに基づいて、C++例外の賛成または反対のケースを構築しようとはしていません。最近、誰かが、例外を使用するコードは、戻り値をチェックしてエラーを処理するために必要なすべての追加の簿記コードを考慮に入れると、戻りコードに基づくコードと同じくらい速く実行されるべきであると主張していると聞きました。何が足りないのですか?

53
user189169

someプラットフォームおよびsomeコンパイラでの例外処理に関連するコストがあります。

つまり、Visual Studioは、32ビットのターゲットを構築するときに、ローカル変数を持つすべての関数にハンドラーを登録します。基本的には、try/finallyハンドラーを設定します。

gccおよび64ビットを対象とするVisualStudioで採用されている他の手法では、例外がスローの場合にのみオーバーヘッドが発生します(この手法には、コールスタックのトラバースとテーブルルックアップが含まれます)。例外がめったにスローされない場合、エラーコードを処理する必要がないため、実際にはより効率的なコードにつながる可能性があります。

46
avakar

Try/catchとtry/exceptブロックのみがセットアップにいくつかの指示を取ります。オーバーヘッドは、最もタイトなループを除いて、すべての場合で一般的に無視できるはずです。しかし、とにかく内側のループでは、通常はtry/catch/exceptを使用しません。

これについて心配する必要はなく、代わりにプロファイラーを使用して、必要に応じてコードを最適化することをお勧めします。

11

これは完全に実装に依存しますが、最近の多くの実装では、例外がスローされない場合、パフォーマンスのオーバーヘッドはほとんどまたはまったくありません。実際、あなたは正しいです。例外を使用しないコード内のすべての関数からの戻りコードを正しくチェックすると、例外を使用するコードに対して何もしない場合よりも遅くなる可能性があります。

もちろん、確実に特定の要件のパフォーマンスを測定する必要があります。

8
CB Bailey

そこにis例外を除いていくつかのオーバーヘッドがあります(他の回答が指摘したように)。

しかし、最近は選択肢があまりありません。プロジェクトで例外を無効にして、すべての依存コードとライブラリがコンパイルおよび実行できることを確認してください。

それらは例外を無効にして動作しますか?

彼らがそうすると仮定しましょう!次に、いくつかのケースをベンチマークしますが、「例外を無効にする」コンパイルスイッチを設定する必要があることに注意してください。そのスイッチがなくても、コードが例外をスローしない場合でも、オーバーヘッドが発生します。

0
Frunsi