[解決済み] C++のExceptionは本当に遅いのか?
質問
私が見ていたのは C++における体系的なエラー処理-Andrei Alexandrescu を見ていて、C++ の例外処理は非常に遅いと言っています。
これは C++98 ではまだ真実なのでしょうか?
どのように解決するのですか?
例外に対して現在主に使用されているモデル (Itanium ABI、VC++ 64 ビット) は、ゼロコスト モデル例外です。
このアイデアは、ガードを設定し、例外の存在をどこでも明示的にチェックすることによって時間を失う代わりに、コンパイラーは例外をスローする可能性のある任意のポイント (プログラム カウンター) をハンドラーのリストにマップするサイド テーブルを生成するというものです。例外が投げられると、このリストが正しいハンドラを選ぶために参照され(もしあれば)、スタックが巻き戻されます。
典型的な
if (error)
の戦略に比べて
- ゼロコストモデルは、その名の通り、例外が発生しない場合は無料です。
-
10倍/20倍程度のコストがかかる
if
例外が発生した場合
しかし、そのコストは些細なことで測れるものではありません。
- サイドテーブルは一般に 冷たい であり、したがってメモリからそれをフェッチするのは長い時間がかかります。
-
正しいハンドラを決定するには、RTTIが必要です。メモリ上に散在する多くのRTTIディスクリプタをフェッチし、複雑なオペレーションを実行します(基本的に
dynamic_cast
テスト)
つまり、ほとんどがキャッシュミスであり、純粋なCPUコードと比較すると些細なことではありません。
注: より詳細については TR18015報告書 5.4章 例外処理 (pdf)
だから、そう、例外は遅いのです
例外パスで
となりますが、それ以外は明示的なチェック(
if
戦略)よりも速いです。
注: Andrei Alexandrescu は、この「より速く」という言葉に疑問を抱いているようです。私自身は、あるプログラムは例外を使用してより速く、別のプログラムは分岐を使用してより速くというように、物事が両方向に振れるのを見てきましたので、確かに特定の条件では最適化の損失があるようです。
それは重要ですか?
私は関係ないと主張します。プログラムは 読みやすさ を念頭に置いて書かれるべきであり、パフォーマンスではありません(少なくとも、第一の基準ではありません)。例外は、呼び出し元が失敗をその場で処理できない、あるいは処理したくないと予想される場合に使用され、スタック上に渡されます。 ボーナス: C++11 では、標準ライブラリを使用してスレッド間で例外をマーシャルすることができます。
これは微妙ですが、私が主張しているのは
map::find
は投げるべきではないと主張していますが、私は
map::find
を返すのは問題ありません。
checked_ptr
を返し、それが NULL であるために参照解除に失敗した場合は throw します。後者の場合は、Alexandrescu が紹介したクラスの場合と同じです。
を選択します。
後者の場合、Alexandrescuが紹介したクラスのように、呼び出し側は明示的なチェックと例外に依存することのどちらかを選択します。呼び出し側により多くの責任を与えることなく権限を与えることは、通常、良い設計のしるしです。
関連
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] const std::string & をパラメータとして渡す時代は終わったのでしょうか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】'std::cout'への未定義の参照