2009-08-25 15 views
33

私はいつも、try/throw/catchがバックグラウンドでどのように見えているのか、C++コンパイルによってアセンブラに変換されるのか疑問に思ってきました。しかし、私はそれを使用していないので、私はそれをチェックアウトすることは決してなかった(一部の人々は怠け者と言うだろう)。C++ try/throw/catch =>マシンコード

try秒を追跡するために使用される通常のスタックです、またはこのためにのみ保持別々のスレッドごとのスタックのですか? MSVCとg ++の間の実装は大小ですか?擬似ASM(IA-32も大丈夫です)を私に見せてください。決して自分でそれをチェックする必要はありません! :)

編集:ここで、IA-32の処理に関するMSVCの実装の基本について説明します。 IA-32上のg ++​​やその他のCPUについて知っている人は誰ですか?

答えて

7

マイクロソフトジャーナルの「フードの下」シリーズが戻って1997年にその時の徹底的な外観は非常に主題でした:

A Crash Course on the Depths of Win32™ Structured Exception Handling

+0

これは、Windowsの構造化例外処理を対象としています。これは、C++の例外処理と関連していますが、同じではありません。Pietrekは、はじめに、MicrosoftとBorlandによって実装されたC++の例外はSEHを使用していますが、彼の記事では実装方法をカバーしていないことに言及しています。 –

+0

長いMSVC/IA-32記事。 –

+1

C++例外はSEH例外のクラスに過ぎず、C++情報(例外クラスインスタンス)を含むラッパーがあります。 C++例外はSEHを使用してカーネル境界などを伝播する必要があります。 –

15

これは主題についての非常に貴重品である: How a C++ compiler implements exception handling

+1

この記事は2002年に公開されています...本当に最新ですか? – Klaim

+0

私はずっと前に概要を取った。私はそれが最新であるかどうか本当に確かではない。 – AraK

+13

2002年はC++の標準でかなり最近のものです – Javier

18

例外ハンドラの悪い実装は各例外ハンドラブロックのいくつかの種類を押してみてくださいtry節が入力されると、実行時スタックに追加され、try節が終了するとポップする。最後にプッシュされた例外ハンドラブロックのアドレスを保持する場所も維持されます。通常、これらの例外ハンドラは連鎖しているため、最新のものから古いものへのリンクをたどって見つけることができます。例外が発生すると、最後にプッシュされたEHハンドラブロックへのポインタが見つけられ、その "try"句のEHケースの処理がチェックされます。 EHの場合のヒットは、プッシュされたEHのポイントまでスタッククリーンアップが発生し、コントロールがEHのケースに移動します。 EH上にヒットがなく、次のEHが見つけられ、プロセスが繰り返されます。 Windows 32ビットSEHスキームはこれのバージョンです。プログラムは、各句を試すためのランタイム代金を支払うため

これには例外が発生していない場合でも(ポップ次にpush)貧弱な実装です。

良い実装では、try節が出現する範囲のテーブルを記録するだけです。これは、try節を入力/終了するためのオーバーヘッドがゼロであることを意味します。 (私のPARLANSE並列プログラミング言語はこの手法を使用しています)。例外は、テーブル内の例外ポイントのPCを検索し、テーブルによって選択されたEHに制御を渡します。 EHコードは、スタックを適切にリセットします。速くてかわいい。 私はWindows 64ビットEHがこのタイプのものだと思いますが、私は注意深く見ていません。

3

C++標準委員会では、C++はおそらくあなたを遅くしていますかについて多くの神話を暴くために、「C++のパフォーマンス」に関する技術報告書を公表しました。これには、例外処理の実装方法の詳細も含まれます。この技術レポートのdraftは無料で入手できます。セクション5.4.1を確認してください。 "例外処理実装の問題とテクニック"。