1. ホーム
  2. c++

[解決済み] C++の例外処理ランタイムはどのように実装されているのですか?

2023-04-30 18:35:33

質問

C++の例外処理機構がどのように動作するのか興味があります。具体的には、例外オブジェクトはどこに格納され、それが捕まるまで複数のスコープをどのように伝搬するのでしょうか。それは、いくつかのグローバルな領域に格納されているのでしょうか?

これはコンパイラーに依存する可能性があるので、誰か g++ コンパイラースイートのコンテキストでこれを説明してください。

どのように解決するのですか?

実装は様々ですが、要件から導かれる基本的な考え方があります。

例外オブジェクト自体は、ある関数で作成され、その呼び出し元で破壊されるオブジェクトです。したがって、スタック上にオブジェクトを作成することは一般的に実行可能ではありません。一方、多くの例外オブジェクトはそれほど大きくありません。そのため、例えば32バイトのバッファを作成し、より大きな例外オブジェクトが実際に必要な場合はヒープにオーバーフローさせることができます。

実際の制御の移行に関しては、2つの戦略が存在します。1 つは、スタック自体に十分な情報を記録して、スタックを解き放つことです。これは基本的に、実行すべきデストラクタと、例外をキャッチするかもしれない例外ハンドラのリストです。例外が発生したら、一致するキャッチを見つけるまで、それらのデストラクタを実行するスタックを実行し直します。

2番目の方法は、この情報をスタックの外側のテーブルに移動します。現在、例外が発生すると、呼び出しスタックは、どのスコープが入力されたが終了していないかを見つけるために使用されます。これらは、投げられた例外がどこで処理されるか、またその間にどのデストラクタが実行されるかを決定するために、静的テーブルで検索されます。これは、スタック上の例外のオーバーヘッドが少なくなることを意味します。テーブルは余分なデータですが、コンパイラはプログラムの需要ロードされたセグメントにそれらを置くことができます。