ホームページ >バックエンド開発 >C++ >C では例外が内部的にどのように動作するのでしょうか?

C では例外が内部的にどのように動作するのでしょうか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-24 07:32:02219ブラウズ

How Do Exceptions Operate Internally in C  ?

C の舞台裏で例外がどのように機能するか

はじめに:

例外はよく疑問視されます彼らの効率のために。この記事では、C の例外の複雑な仕組みを検討して、その実行プロセスを包括的に理解できるようにします。

例外処理メカニズム:

例外は、繰り返し実行することに直接似ているわけではありません。戻ります。これらには、例外テーブルの追加層が含まれます。例外がスローされると、コンパイラーは __cxa_throw への呼び出しを生成します。これは、これらのテーブルを利用してハンドラーを見つけ、適切なハンドラーに到達するまでスタックを巻き戻します。

例外のスロー:

例外をスローするには、次の理由から実行時オーバーヘッドが大幅に必要になります。

  • __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 を使用してこのコードをコンパイルすると、次のアセンブリ出力が生成されました:

  1. 例外のスロー:

    _Z20my_throwing_functionb:
     ...
     movl    , (%esp)
     call    __cxa_allocate_exception
     ...
     movl    %eax, (%esp)
     call    __cxa_throw
     ...
  2. 例外処理表:

    .section    .gcc_except_table,&quot;a&quot;,@progbits
    .LLSDATT9:
     ...
     .uleb128 .LEHB1-.LFB9
     .uleb128 .LEHE1-.LEHB1
     .uleb128 .L12-.LFB9
     .uleb128 0x1
     ...

結論:

例外には相当の処理が必要処理と巻き戻しにかかるオーバーヘッドが軽減され、戻り値にかかる費用は最小限に抑えられます。例外は例外的なシナリオに最適ですが、パフォーマンスの低下を避けるために慎重に使用する必要があります。

以上がC では例外が内部的にどのように動作するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。