[解決済み] C++の例外処理ランタイムはどのように実装されているのですか?
質問
C++の例外処理機構がどのように動作するのか興味があります。具体的には、例外オブジェクトはどこに格納され、それが捕まるまで複数のスコープをどのように伝搬するのでしょうか。それは、いくつかのグローバルな領域に格納されているのでしょうか?
これはコンパイラーに依存する可能性があるので、誰か g++ コンパイラースイートのコンテキストでこれを説明してください。
どのように解決するのですか?
実装は様々ですが、要件から導かれる基本的な考え方があります。
例外オブジェクト自体は、ある関数で作成され、その呼び出し元で破壊されるオブジェクトです。したがって、スタック上にオブジェクトを作成することは一般的に実行可能ではありません。一方、多くの例外オブジェクトはそれほど大きくありません。そのため、例えば32バイトのバッファを作成し、より大きな例外オブジェクトが実際に必要な場合はヒープにオーバーフローさせることができます。
実際の制御の移行に関しては、2つの戦略が存在します。1 つは、スタック自体に十分な情報を記録して、スタックを解き放つことです。これは基本的に、実行すべきデストラクタと、例外をキャッチするかもしれない例外ハンドラのリストです。例外が発生したら、一致するキャッチを見つけるまで、それらのデストラクタを実行するスタックを実行し直します。
2番目の方法は、この情報をスタックの外側のテーブルに移動します。現在、例外が発生すると、呼び出しスタックは、どのスコープが入力されたが終了していないかを見つけるために使用されます。これらは、投げられた例外がどこで処理されるか、またその間にどのデストラクタが実行されるかを決定するために、静的テーブルで検索されます。これは、スタック上の例外のオーバーヘッドが少なくなることを意味します。テーブルは余分なデータですが、コンパイラはプログラムの需要ロードされたセグメントにそれらを置くことができます。
関連
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] Pythonで例外を表示するには?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
最新
-
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で暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】Enterキーを押して続行する
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] c++で例外はどのように動作するのか?