1. ホーム
  2. c++

コンパイラオプションの /Ox と /O2 の違いは何ですか?

2023-12-03 20:43:28

質問

マイクロソフトの C++ コンパイラ ( cl.exe Visual Studio に含まれるもの) が提供する いくつかの最適化スイッチ . それらのほとんどの違いは自明なようですが、以下の違いは私にはわかりません。 /O2 (最大限の速度を得るためにコードを最適化する) と /Ox (完全最適化)を選択します。

を読み込んでみましたが ドキュメント を読んでみました。 /Ox オプションのドキュメントを見ると、このスイッチもサイズではなく、最大速度の最適化を有効にすることが確認できるようです。

その /Ox コンパイラオプションは、小さいサイズよりも実行速度を優先するコードを生成します。

しかし、特に、"Remarks"セクションにある次の文が私の目を引いた。

一般に、以下のように指定します。 /O2 (速度の最大化)の代わりに /Ox .

そこで質問なのですが なぜ一般的に /O2 よりも /Ox ? 後者のオプションは、予期せぬバグやその他の予期せぬ動作を引き起こすことが知られている特定の最適化を可能にするのでしょうか?単に、得られる最適化の量が追加のコンパイル時間に見合わないということでしょうか?それとも、以下の事実から生じる、まったく意味のない推奨事項なのでしょうか? /O2 デフォルト というオプションはVSにありますか?

どのように解決するのですか?

アーシャの回答 は、Visual Studio 2005に関するブログ記事を引用しており、かなり古いものです。

最新版のドキュメントはこちらでご覧になれます。

それらによると

この他にも、以下のようなものがあります。 /GS- これはスタック周りのセキュリティチェックをオフにするもので、 パフォーマンスに大きな打撃を与える可能性があります ( MS docs for /GS ).

これまで通り、特定のアプリケーションをベンチマークする必要があります。