andブロックC++
を使用する際の例外処理については認識していました。この機能が にあるのだろうかと思いました。これで、 の基本的なエラー処理は によって行われることがわかりました。try
catch
C
C
setjmp/longjmp
setjmp/longjmp
には存在しないのでC++
、そのtry/catch
方が良いと思いますか? どんな風に???
を使用してtry/catch
機能を実装できます。どう違うの??C
setjmp/longjmp
andブロックC++
を使用する際の例外処理については認識していました。この機能が にあるのだろうかと思いました。これで、 の基本的なエラー処理は によって行われることがわかりました。try
catch
C
C
setjmp/longjmp
setjmp/longjmp
には存在しないのでC++
、そのtry/catch
方が良いと思いますか? どんな風に???
を使用してtry/catch
機能を実装できます。どう違うの??C
setjmp/longjmp
主な違いは、try/catch がスタック上のオブジェクトを認識し、スタックに割り当てられたオブジェクトの dtors を呼び出す方法を知っていることだと思いますが、setjmp はこれに対して何もしません。
また、ユーザー インターフェイスがより充実しており、いくつかの例外の種類を定義して、それに基づいて異なる動作をさせることができます。
try
/はRAIIcatch
を説明します。スコープを離れるすべてのオブジェクトは適切に破棄されます。
setjmp
/longjmp
しません。
RAII などの言語機能が欠落しているにもかかわらず、setjmp/longjmp
例外のスロー/キャッチに使用されるメカニズムとは根本的に異なります。最近では、例外が実際にスローされた場合にのみオーバーヘッドが発生し、それ以外の場合はオーバーヘッドが発生しないゼロコストのアプローチを使用して例外が処理されます。優れたアプリケーションでは一般に例外がスローされないことが前提であるため、「ゼロ コスト」と呼ばれます。setjmp/longjmp を使用すると、「try ブロックに入る」たびにジャンプ ポイント/コンテキストを設定することになります。したがって、ジャンプ ポイントを設定するためだけに、多くのランタイム オーバーヘッドが発生します。ある日、例外は次を使用して実装されましたsetjmp/longjmp
(コンパイラによって、RAIIおよび他の人が「欠落している」と述べた他のすべてのもの-したがって、彼らの答えが完全に正しくない理由がわかります)、理論的には同じことを達成できますが、パフォーマンス。例外処理の実装の詳細については、Itanium C++ ABI: Exception Handlingを参照してください。
デストラクタをsetjmp/longjmp
処理する場合と処理しない場合がありますが、それは設計の観点からは重要な違いではありません。重要なのは、例外をスローするときに、それが処理される場所がわからない、または気にしないということです。実装は、スローされた型を処理できる catch 句が見つかるまで、またはスタックの一番上に到達するまで、コール スタックを調べます。後者の場合、プログラムは中止されます。
setjmp/longjmp を使用して、C で try/catch/finally 機能を実装できました。どう違うの??
これが質問に対する答えです (自分で行う必要はありません)。