web-dev-qa-db-ja.com

VisualStudioの「マルチプロセッサコンパイル」に不利な点はありますか?

Visual Studio for C++プロジェクトで[マルチプロセッサコンパイル]オプションを使用するときに注意する必要のある欠点、副作用、またはその他の問題はありますか?または、質問を別の言い方で言うと、Visual Studioでこのオプションがデフォルトでオフになっているのはなぜですか?

26
JBentley

/MPのドキュメントによると

互換性のないオプションと言語機能
/MPオプションは、一部のコンパイラオプションおよび言語機能と互換性がありません。互換性のないコンパイラオプションを/MPオプションと一緒に使用すると、コンパイラは警告D9030を発行し、/MPオプションを無視します。互換性のない言語機能を使用する場合、コンパイラはエラーC2813を発行し、現在のコンパイラ警告レベルオプションに応じて終了または続行します。
注:
ほとんどのオプションは互換性がありません。許可されている場合、同時に実行されるコンパイラーは、コンソールまたは特定のファイルに同時に出力を書き込むためです。その結果、出力が混ざり合って文字化けします。場合によっては、オプションの組み合わせによってパフォーマンスが低下することがあります。

また、/MPと互換性のないコンパイラオプションと言語機能を一覧表示する表を提供します。

  • #importプリプロセッサディレクティブ(タイプライブラリのタイプをC++クラスに変換してから、それらのクラスをヘッダーファイルに書き込みます)
  • /E/EP(プリプロセッサ出力を標準出力(stdout)にコピーします)
  • /Gm(インクリメンタル再構築を有効にします)
  • /showIncludes(インクルードファイルのリストを標準エラー(stderr)に書き込みます)
  • /Yc(プリコンパイル済みヘッダーファイルを書き込みます)

Visual Studioでは、これらの他のオプションをデフォルトで無効にする(およびデフォルトで/MPを有効にする)代わりに、これらの機能を手動で無効/防止し、/MPを有効にします。

18
Cornstalks

私たちの経験から、見つかった主な問題は次のとおりです。

  1. 複数のプロジェクトが同時にbscmakeを呼び出すため、情報の構築に失敗します(最近は役に立たない情報なので、プロジェクト設定として削除する必要があります)
  2. 依存関係の問題とビルド順序の問題によるリンカーの障害。通常のビルドでは通常は表示されません。
  3. バッチビルドはマルチプロセッサコンパイルを利用しません、少なくともこれは2005-2008VSエディションに確かに当てはまりました
  4. プリコンパイル済みヘッダーに互換性がないことについて警告が生成されます。これは、stdafxをビルドするときに発生し、無視できますが、再構築を実行すると、このメッセージが生成されます。

ただし、上記は解決できる構成の問題です。それ以外の場合は、ビルドが高速化されるため、有効にする必要があります。

10
EdChum

マルチプロセッサコンパイルは他の多くのコンパイルオプションと互換性がなく、システムリソースの使用率も高いためです。それが彼にとって価値があるかどうかを決めるのは開発者次第です。完全なドキュメントはここにあります: http://msdn.Microsoft.com/en-us/library/bb385193.aspx

6