164

プロジェクトのコンパイルに使用するコンパイラを決定するのに十分な情報が見つかりません。プロセスをシミュレートするさまざまなコンピューター上にいくつかのプログラムがあります。Linux では、GCC を使用しています。すべてが素晴らしいです。コードを最適化できます。コンパイルは高速で、メモリの使用量もそれほど多くありません。

MSVC および GCC コンパイラを使用して独自のベンチマークを行っています。後のものは、わずかに高速なバイナリを生成します (サブアーキテクチャごとに)。ただし、コンパイル時間は MSVC よりもはるかに長くなります。

そこで、MinGW を使用することにしました。しかし、MinGW での例外処理メソッドとその実装に関する説明は見つかりません。オペレーティング システムやアーキテクチャごとに異なるディストリビューションを使用できます。

考慮事項:

  • 私の使用法では、コンパイル時間とメモリは重要ではありません。唯一重要なことは、ランタイムの最適化です。プログラムが十分に高速である必要があります。遅いコンパイラは許容されます。
  • OS: マイクロソフト Windows XP / 7 / 8 / Linux
  • アーキテクチャ: Intel Core i7 / Core2 / および XP を実行する非常に古い i686 :P
4

2 に答える 2

119

MinGW-w64 Wikiに短い概要があります。

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

Windows 用のDwarf-2 EH実装は、64 ビット Windows アプリケーションで動作するようにはまったく設計されていません。win32 モードでは、例外アンワインド ハンドラーは非 dw2 認識コードを介して伝達できません。これは、Windows システム DLL および Visual Studio でビルドされた DLL を含め、非 dw2 認識の「外部フレーム」コードを通過するすべての例外が失敗することを意味します。gcc の Dwarf-2 巻き戻しコードは、x86 巻き戻しアセンブリを検査し、他の Dwarf-2 巻き戻し情報なしでは続行できません。

例外処理のSetJump LongJumpメソッドは、一般的な保護違反を除いて、win32 と win64 の両方でほとんどの場合に機能します。gcc での構造化例外処理サポートは、dw2 と sjlj の弱点を克服するために開発されています。win64 では、アンワインド情報は xdata セクションに配置され、スタックの代わりに .pdata (関数記述子テーブル) があります。win32 の場合、ハンドラーのチェーンはスタック上にあり、実際に実行されるコードによって保存/復元する必要があります。

例外処理に関するGCC GNU :

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

  • DWARF-2 (DW2) EH 。DWARF -2 (または DWARF-3) デバッグ情報を使用する必要があります。DW-2 EH により、実行可能ファイルに大きな呼び出しスタック巻き戻しテーブルを含める必要があるため、実行可能ファイルがわずかに肥大化する可能性があります。
  • setjmp/longjmp (SJLJ)に基づくメソッド。SJLJ ベースの EH は DW2 EH よりもはるかに低速ですが (例外がスローされない場合でも通常の実行にペナルティが課せられます)、GCC でコンパイルされていないコードや呼び出しスタックの巻き戻し情報を持たないコードでも機能します。

[...]

構造化例外処理 (SEH)

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

以下も参照してください。

于 2013-03-28T15:03:34.117 に答える
89

SJLJ (setjmp/longjmp): – 32 ビットおよび 64 ビットで使用可能 – 「ゼロ コスト」ではない: 例外がスローされなくても、わずかなパフォーマンス ペナルティが発生します (例外の多いコードでは最大 15%) – 例外を許可しますたとえば、Windows コールバックをトラバースする

DWARF (DW2、dwarf-2) – 32 ビットのみで使用可能 – 永続的なランタイム オーバーヘッドなし – コール スタック全体を dwarf 対応にする必要があります。つまり、Windows システム DLL などで例外をスローすることはできません。

SEH (ゼロ オーバーヘッド例外) – 64 ビット GCC 4.8 で使用可能になります。

ソース: https://wiki.qt.io/MinGW-64-bit

于 2013-03-27T21:55:02.167 に答える