3

andブロックC++を使用する際の例外処理については認識していました。この機能が にあるのだろうかと思いました。これで、 の基本的なエラー処理は によって行われることがわかりました。trycatchCCsetjmp/longjmp

setjmp/longjmpには存在しないのでC++、そのtry/catch方が良いと思いますか? どんな風に???

を使用してtry/catch機能を実装できます。どう違うの??Csetjmp/longjmp

4

5 に答える 5

4

主な違いは、try/catch がスタック上のオブジェクトを認識し、スタックに割り当てられたオブジェクトの dtors を呼び出す方法を知っていることだと思いますが、setjmp はこれに対して何もしません。

また、ユーザー インターフェイスがより充実しており、いくつかの例外の種類を定義して、それに基づいて異なる動作をさせることができます。

于 2013-02-16T20:24:49.120 に答える
4

try/はRAIIcatchを説明します。スコープを離れるすべてのオブジェクトは適切に破棄されます。

setjmp/longjmpしません。

于 2013-02-16T20:25:13.630 に答える
2

RAII などの言語機能が欠落しているにもかかわらず、setjmp/longjmp例外のスロー/キャッチに使用されるメカニズムとは根本的に異なります。最近では、例外が実際にスローされた場合にのみオーバーヘッドが発生し、それ以外の場合はオーバーヘッドが発生しないゼロコストのアプローチを使用して例外が処理されます。優れたアプリケーションでは一般に例外がスローされないことが前提であるため、「ゼロ コスト」と呼ばれます。setjmp/longjmp を使用すると、「try ブロックに入る」たびにジャンプ ポイント/コンテキストを設定することになります。したがって、ジャンプ ポイントを設定するためだけに、多くのランタイム オーバーヘッドが発生します。ある日、例外は次を使用して実装されましたsetjmp/longjmp(コンパイラによって、RAIIおよび他の人が「欠落している」と述べた他のすべてのもの-したがって、彼らの答えが完全に正しくない理由がわかります)、理論的には同じことを達成できますが、パフォーマンス。例外処理の実装の詳細については、Itanium C++ ABI: Exception Handlingを参照してください。

于 2013-02-16T20:50:14.843 に答える
0

デストラクタをsetjmp/longjmp処理する場合と処理しない場合がありますが、それは設計の観点からは重要な違いではありません。重要なのは、例外をスローするときに、それが処理される場所がわからない、または気にしないということです。実装は、スローされた型を処理できる catch 句が見つかるまで、またはスタックの一番上に到達するまで、コール スタックを調べます。後者の場合、プログラムは中止されます。

于 2013-02-16T21:40:41.680 に答える
-2

setjmp/longjmp を使用して、C で try/catch/finally 機能を実装できました。どう違うの??

これが質問に対する答えです (自分で行う必要はありません)。

于 2013-02-16T20:23:07.017 に答える