C の舞台裏で例外がどのように機能するか
はじめに:
例外はよく疑問視されます彼らの効率のために。この記事では、C の例外の複雑な仕組みを検討して、その実行プロセスを包括的に理解できるようにします。
例外処理メカニズム:
例外は、繰り返し実行することに直接似ているわけではありません。戻ります。これらには、例外テーブルの追加層が含まれます。例外がスローされると、コンパイラーは __cxa_throw への呼び出しを生成します。これは、これらのテーブルを利用してハンドラーを見つけ、適切なハンドラーに到達するまでスタックを巻き戻します。
例外のスロー:
例外をスローするには、次の理由から実行時オーバーヘッドが大幅に必要になります。
例外的な戻り値:
対照的に、値を返す場合のオーバーヘッドは最小限です。例外は、例外的なシナリオの場合にのみ、慎重に使用する必要があります。
コード例:
次の単純な C コードは、例外処理の命令生成を示しています。
<code class="cpp">class MyException { public: MyException() { } ~MyException() { } }; void my_throwing_function(bool throwit) { if (throwit) throw MyException(); } void another_function(); void log(unsigned count); void my_catching_function() { log(0); try { log(1); another_function(); log(2); } catch (const MyException& e) { log(3); } log(4); }</code>
生成されたアセンブリ:
Linux 上の GCC を使用してこのコードをコンパイルすると、次のアセンブリ出力が生成されました:
例外のスロー:
_Z20my_throwing_functionb: ... movl , (%esp) call __cxa_allocate_exception ... movl %eax, (%esp) call __cxa_throw ...
例外処理表:
.section .gcc_except_table,"a",@progbits .LLSDATT9: ... .uleb128 .LEHB1-.LFB9 .uleb128 .LEHE1-.LEHB1 .uleb128 .L12-.LFB9 .uleb128 0x1 ...
結論:
例外には相当の処理が必要処理と巻き戻しにかかるオーバーヘッドが軽減され、戻り値にかかる費用は最小限に抑えられます。例外は例外的なシナリオに最適ですが、パフォーマンスの低下を避けるために慎重に使用する必要があります。
以上がC では例外が内部的にどのように動作するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。