[解決済み] sjlj vs dwarf vs sehの違いは何ですか?
質問
自分のプロジェクトをコンパイルするためにどのコンパイラーを使うべきか、十分な情報が得られません。異なるコンピュータでプロセスをシミュレートするいくつかのプログラムがあります。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をサポートしていません。 [...]
こちらもご覧ください。
関連
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] g++とgccの違いは何ですか?
-
[解決済み] CygwinとMinGWの違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む