MicrosoftのC++コンパイラ(Visual Studioに含まれるcl.exe
)は、 いくつかの最適化スイッチ を提供します。それらのほとんどの違いは自明のように見えますが、/O2
(最大速度に合わせてコードを最適化する)と/Ox
(「完全最適化」を選択する)の違いは明確ではありません。
/Ox
オプションの documentation を読んでみましたが、このスイッチはサイズではなく最大速度の最適化も有効にすることを確認しているようです:
/Ox
コンパイラオプションは、小さいサイズよりも実行速度を優先するコードを生成します。
しかし、特に、「備考」セクションの下の次の文は私の目を引きました。
一般に、
/O2
の代わりに/Ox
(最大速度)を指定します。
私の質問は、なぜ/O2
よりも/Ox
を好むのですか?後者のオプションは、予期しないバグや予期しない動作を引き起こすことが知られている特定の最適化を有効にしますか?取得する最適化の量は、追加のコンパイル時間の価値がないというだけですか?または、これは/O2
がVSのdefaultオプションであるという事実に起因する、まったく意味のない「推奨」ですか?
Ashaの答え Visual Studio 2005に関するブログ投稿を引用しており、かなり古くなっています。
ドキュメントの最新バージョンは、次から入手できます。
/Ox
: https://msdn.Microsoft.com/en-us/library/59a3b321.aspx/O2
: https://msdn.Microsoft.com/en-us/library/8f8h5cxt.aspxそれらによると:
/Ox
→/Og /Oi /Ot /Oy /Ob2
/O2
→同じですが、/Gs /GF /Gy
/GF
重複する文字列を削除/Gy
は 関数レベルのリンクさらに、/GS-
これは、スタックのセキュリティチェックをオフにします。これは、重大なパフォーマンスヒットになる可能性があります( MSのドキュメント を参照)。
これまでどおり、特定のアプリケーションのベンチマークを行う必要があります。
私はそれを見つけました ここ :
OxとO2はほぼ同じです。 O2が [〜#〜] gf [〜#〜] および Gy もスローするという事実のみが異なります。これらの2つのスイッチをスローすることを避ける理由はほとんどありません。