0

私は最近、MS Visual Studio 2003 コンパイラを使用してコンパイルされる C および C++ で書かれたプロジェクトを引き継ぎました。私はコンパイラ設定とコンパイラ出力の経験が少し不足しているので、指定されたセットアップが本当に違いを生むかどうかを知りたいです (コンパイル出力またはパフォーマンスによる)。

このプロジェクトでは、C と C++ が混在しています。主要部分は C で書かれていますが、C++ で書かれたいくつかのクラスを使用しています。したがって、質問の最初の部分は次のとおりです。(MS VS 2003) コンパイラはファイルごとに違いがありますか (c 機能のみを使用して .cpp ファイルのプレーン c をコンパイルし、クラスを使用してファイルの c++ スタイルをコンパイルします)? それを使用する理由はありますか (パフォーマンスの向上、下位互換性)?

このプロジェクトは、try-catch ブロックも使用しません (単純な C ではないため)。ただし、コンパイラ設定の例外処理オプションは無効になっていません。質問の 2 番目の部分: try-catch を使用せずにコンパイラで無効にしないことで、パフォーマンスが向上する (またはその他の論理的な理由がある) 可能性はありますか?

はい、私はこの設定にかなり混乱していて、理解しようとしています。

4

1 に答える 1

1

デコードするのはかなり難しいので、試してみます。デフォルトの動作では、ソース コードのファイル名拡張子が .c で終わる場合は C コンパイラを取得し、.cpp で終わる場合は C++ コンパイラを取得します。この背後にあるより大きなスキームや、下位互換性やパフォーマンスの向上に関係するものはありません。.cpp ファイルには C++ コードが含まれていることが単純に想定されています。どちらのコンパイラも同じバックエンド (コード ジェネレーターとオプティマイザー) を使用するため、C コードを C++ コンパイラーでコンパイルしても大きな違いはありません。

/EH コンパイル オプションは、コード内に C++ オブジェクトを作成し、例外がスローされる可能性があることをコンパイラが認識できる場合にのみ、何らかの処理を行います。コードベースの大部分が C ベースである場合、違いはありません。/EH の実際のコストは非常に低く、例外フィルターを登録するのに数 CPU サイクルかかります。例外処理で関数テーブルを使用する場合、コストはかかりませんが、それをサポートするには古すぎることはほぼ確実です (/SAFESEH または x64 コード)。

大規模なプロジェクトを引き継いだばかりの場合、コンパイラの設定をいじるのは優先度が低いはずです。コードを壊す可能性があり、問題のデバッグに苦労する可能性のあるオプションを変更する前に、まずコードベースを理解してください。または、別の言い方をすれば、わずかな時間で大きな成果を上げたように見せるデウス エクス マキナを探すのは避けましょう。プロファイラーを使用すると、はるかに強力で優れた洞察が得られます。

于 2012-12-15T15:21:35.960 に答える