1. ホーム
  2. c++

[解決済み] sjlj vs dwarf vs sehの違いは何ですか?

2022-04-25 12:17:50

質問

自分のプロジェクトをコンパイルするためにどのコンパイラーを使うべきか、十分な情報が得られません。異なるコンピュータでプロセスをシミュレートするいくつかのプログラムがあります。Linuxでは、私はGCCを使っています。すべてが素晴らしいです。コードを最適化できるし、コンパイルは速いし、メモリもそれほど使わない。

MSVCとGCCコンパイラで自分なりにベンチマークをとっています。後者の方がわずかに速いバイナリを生成します(各サブアーキテクチャで)。しかし、コンパイル時間はMSVCの方がはるかに長いです。

そこで、MinGWを使うことにしました。しかし、MinGWでは例外処理方法とその実装についての説明が見当たりません。OSやアーキテクチャによってディストリビューションを使い分けることができるのですが。

検討中です。

  • 私の使い方では、コンパイル時間やメモリは重要ではありません。重要なのは実行時の最適化だけです。私はプログラムが十分に速くなることを必要としています。遅いコンパイラは許容範囲です。
  • OS: Microsoft Windows XP / 7 / 8 / Linux
  • アーキテクチャ Intel Core i7 / Core2 / そしてXPが動作する非常に古いi686 :P

解決方法は?

簡単な概要が MinGW-w64 ウィキ :

<ブロッククオート

mingw-w64 gcc はなぜ Dwarf-2 例外処理をサポートしないのですか?

Dwarf-2 EH Windows用の実装は、全く設計されていません。 は64ビットWindowsアプリケーションで動作します。win32モードでは、例外 unwind ハンドラは、w2 を意識していないコードには伝搬しない。 を通過する例外は、w2 を認識していない外国フレームを通過することになります。 を経由する例外は、Windows システムや Visual Studioです。gcc の Dwarf-2 巻き戻しコードは、x86 の のアセンブリーで、他のDwarf-2がないと先に進めない。 アンワインド情報

SetJump LongJump の例外処理方法は、ほとんどの場合において有効です。 win32とwin64の両方で、一般的なプロテクションフォールトを除くケース。 gccの構造化された例外処理のサポートは dw2やsjljの弱点を克服しています。win64では unwind-informationはxdata-sectionに置かれ、.pdataがあります。 (関数記述子テーブル)をスタックの代わりに使用します。win32の場合、チェーン ハンドラはスタック上にあり、実機で保存/復元する必要があります。 が実行されます。

GCC GNU について 例外処理 :

GCCは例外処理(EH)のために2つの方法をサポートしています。

  • ドワーフ2 (dw2) EH DWARF-2 (または DWARF-3) のデバッグ情報を使用する必要があります。DW-2 EH は、実行ファイルのサイズを大きくします。 大きなコールスタック巻き戻しテーブルが必要なため、若干肥大化します。 は実行ファイルに含まれます。
  • をベースにした方法。 setjmp/longjmp (SJLJ) . SJLJベースのEHは、DW2 EHよりもはるかに遅いです(何もないときの正常な実行にさえペナルティがあります)。 例外がスローされた場合)、しかし、その例外がスローされていないコードで動作することができます。 GCCでコンパイルされたものや、コールスタックの巻き戻しがないものは の情報を提供します。

[...]

構造化例外処理(SEH)

Windowsは、構造化例外処理(SEH)と呼ばれる独自の例外処理機構を使用しています。 [...] 残念ながら、GCCはまだSEHをサポートしていません。 [...]

こちらもご覧ください。