GCCマニュアルを試しましたか?
-fno-enforce-eh-specs
実行時に例外仕様の違反をチェックするコードを生成しないでください。このオプションは C++ 標準に違反しますが、` ' を定義するのと同じように、プロダクション ビルドでコード サイズを削減するのに役立つ場合がありますNDEBUG
。これは、例外仕様に違反して例外をスローする許可をユーザー コードに与えるものではありません。コンパイラは引き続き仕様に基づいて最適化するため、予期しない例外をスローすると、実行時に未定義の動作が発生します。
EH フレームの生成を強制するわけではありませんが、呼び出しを停止する必要があるstd::unexpected()
ため、ケースに役立つ場合があります。
ドキュメントが言うように、「コンパイラはまだ仕様に基づいて最適化する」ため、たとえば、への呼び出しをmethod()
キャッチ サイトにインライン化できる場合は役に立ちません。コンパイラは、キャッチが必要ないと想定しているためです。例外はスローされないため、例外がスローされてもキャッチされません。への呼び出しがmethod()
キャッチ サイトにインライン化できない場合、例外は呼び出されずに終了method()
しstd::unexpected()
、スタックの上位でキャッチされる可能性があります。
編集:これは、次の場合でも呼び出さstd::terminate()
れ-fno-enforce-eh-specs
ます:
void func() throw() { throw ""; }
void func2() { func(); }
int main() { try { func2(); } catch (...) { } }
コンパイラは、 への呼び出しがfunc2
非スロー関数のみを呼び出していることを確認できるため、catch
は決して必要とされず、最適化されなくなります。例外がスローされても、キャッチされません。
これは動作し-fno-enforce-eh-specs
、終了しません:
/* func2.cc */
void func() throw();
void func2() { func(); }
/* main.cc */
void func2();
int main() { try { func2(); } catch (...) { } }
ここで、 をコンパイルするときmain.cc
、コンパイラは がfunc2
スローされるかどうかを判断できません。これは、 には例外指定がなく、その定義が に表示されないmain.cc
ため、catch
を省略できないためです。例外がスローされると、キャッチされます。