3

Objective-Cランタイムシステムのソースコード、特にobjc-exception.mmファイルを見ると、「altハンドラー」という式とaltハンドラーを処理する関数が見つかりました。それが何であるかはわかりませんが、ファイルのコメントによると、ランタイムライブラリがaltハンドラーのサポートなしでコンパイルされている場合、ゼロコストの実装しかなく、それが何であるかもわかりません。

では、Objective-Cランタイムライブラリについて話しているとき、altハンドラーとは何ですか?ゼロコストの例外処理とは何ですか?

4

2 に答える 2

4

Objective-C ランタイム ライブラリを使用すると、開発者は、スローされた例外の catch 句が見つかった後、クリーンアップ フェーズで、システムがスタックを 2 回目にアンワインドしている間に、スタック フレームごとに呼び出される関数を指定できます。

そのため、Unwind ライブラリと ObjC 例外処理システムの両方に精通している場合__objc_personality_v0、現在のスタック フレームの Unwind コンテキストに対して Objective-C パーソナリティ ルーチン ( ) が呼び出されると、ObjC システムはその代替ハンドラーがあるかどうかをチェックします。環境。alt ハンドラーが見つかった場合は、最初に呼び出されます。その後、ObjC 例外処理機構が C++ ABI を使用してスタックをアンワインドするため、cxx パーソナリティ関数 ( __gxx_personality_v0) が呼び出されます。ただし、これは、検索フェーズではなく、クリーンアップ フェーズで objc パーソナリティ ルーチンが呼び出されている場合にのみ行われます。そのため、現在の例外の catch 句が見つからない場合、alt ハンドラーは呼び出されません。

ゼロ コストの部分については、cxx パーソナリティ関数はゼロ コストの例外処理を使用します。したがって、ランタイム ライブラリが alt ハンドラのサポートなしでコンパイルされている場合、__gxx_personality_v0とにかく呼び出されるため、ゼロ コストの実装しかありません。

Objective-C ライブラリのパブリック API は、特定の Unwind Context の alt ハンドラーを追加および削除する 2 つの関数を提供します:それぞれobjc_addExceptionHandlerobjc_removeExceptionHandler

于 2013-03-23T13:59:13.553 に答える
2

ルイス、あなたは、例外がスローされたときに関数が呼び出される関数が格納されているという点で正しいですが、例外ハンドラーが見つからない場合にプログラムが自動的に終了するという点では間違っています (もう少し興味深いです)それより)。例外がトリガーされた瞬間 (不正なメモリの読み取り、0 による div など)、オペレーティング システム (windows/*nix) は、インストールされている例外ハンドラーのチェーンを調べて、最初に見つかった例外ハンドラーを呼び出します。try{}catch{}ブロック。現在、プログラムされていない場合は、デフォルトのハンドラーが実行され、ほとんどの場合、プログラムが終了し、スタックの巻き戻しが実行されます。カーネル モード プログラミングでは、独自のハンドラーをインストールしないと、システム全体をセグメンテーション違反にする可能性があります。既定の例外ハンドラーは、ほとんどの場合、ユーザー モード プログラムにのみ提供されます。

本当に長い回答を書くこともできますが、あなたの質問に答えるのに役立つと思う完璧なサイトを見つけました。これは、コンパイラレベルで例外ハンドラを実装するさまざまな方法を理解するのに役立ちます。 「ゼロコスト」の例外ハンドラと SJLJ テクニックは、コードにも次のように記述しています。

例外処理の説明

于 2013-03-23T00:14:16.490 に答える