none
コンパイラ オプションの違いについて

    質問

  • 初めて、質問させていただきます。

    プログラム開発で、プログラムが正常に動作できず困っております。

    Release版で/O2になっている状態の動作にてプログラムが正常に動作しなかった為

    Debug版にて動作させたところプログラムが正常に動作する事が分かり、違いとしてコンパイルオプションが違うので変更した結果

    動作が正常に動くことが分かった為、/Od に変更したのですが、違いはどのような現れますでしょうか?

    /O2 コードを最速化します。 

          ↓変更

    /Od 最適化を無効にします。

    最適化を無効にすることでの影響を教えて頂きたく思っております。

    よろしくお願いします。

    2018年5月29日 8:58

すべての返信

  • まず、どの様な部分に障害が起こるか説明したほうが良いかもしれません。
    構築環境、実行環境についても詳しく説明すべきです。

    次に、コンパイラオプション 「/W3:警告レベル3」になってますでしょうか。
    一般に/W3で警告が出るようだと、コードの記述自体に誤りがある疑いを排除できません。
    未初期化の変数の参照等も警告してくれますので、これで瑕疵が解消する場合もあります。

    次に「デバッグ情報付きのリリースビルド」という構成を作成することができます。
    (参考)https://msdn.microsoft.com/ja-jp/library/fsk896zz.aspx?f=255&MSPPError=-2147217396
    これで瑕疵が発生する場合には、ステップ実行で瑕疵の場所を特定できるかもしれません。

    最後に、一般的な説明においては、
    /Od : 最適化を無効にします。
    /O2 : ほとんどの場合、最高速のコードを作成します。これは、リリース ビルドの既定の設定です。

    なのですが、/O2は以下のオプションを指定したのと等価だそうです。

    /Og : ローカルおよびグローバルな最適化
    /Oi : 一部の関数呼び出しを組み込み関数などの特別な関数形式に置き換え
    /Ot : サイズよりも実行速度を優先
    /Oy : 呼び出し履歴にフレーム ポインタが作成されなくなります
    /Ob2 : 自動インライン化
    /Gs : 高度なスタックプローブの制御
    /GF : 同一文字列の単一化
    /Gy : 関数レベルのリンクの有効化

    コンパイラによってできるかどうかはわかりませんが、一つ一つつけたり外したりしてみるのも手かもしれません。

    2018年5月29日 9:32
  • > Release版で/O2になっている状態の動作にてプログラムが正常に動作しなかった為

    「正常に動作しなかった」とは、具体的にどのような問題が発生したのでしょうか?
    -O2 で APPCRASH が発生するのであれば、スタックの扱い等に潜在的な Bug が存在している可能性が高いと思います。
    なので、コンパイル オプションでの回避を検討するよりも、きちんと原因究明を行った方がいいかと。
    ("Application Verifier" を使えば、簡単に原因を特定できる。。。かも。)

    2018年5月29日 9:52
  • まずVisual Studio共通フォーラムで質問されていますが、 /O2 等、Visual C++に限定した話題であり、フォーラムの選択が不適切です。モデレータの方、移動をお願いします。

    また「正常に動作しなかった」とのことですが、この表現では第三者からみて情報量0です。期待する結果と実際の結果、両方を提示し、何をもって正常でないと判断したのかを説明すべきです。

    仲澤@失業者さんからコンパイルオプション /W3 が提案されていますが、検出されなかった場合は /W4 等、更に詳細な警告を出力することができるので参考にしてください。別アプローチとして/analyze コード分析も用意されています。/sdl 追加のセキュリティ チェックの有効化もありますが/W4と一部機能が被ります。これらはいずれもコンパイル時に問題を指摘してくれます。

    それとは別に/RTC ランタイム エラー チェック/GS バッファーのセキュリティ チェックも有効です。こちらはコンパイル時にチェック処理を埋め込み、実行時に問題を検出してくれます。

    2018年5月29日 13:12
  • しぎょうさん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    ご質問されるときには開発環境などの詳細情報もご記載いただいた方が
    情報が寄せられやすくなります。

    下記のスレッドに参考情報がありますので、ご紹介させていただきますね。

    フォーラムでご質問頂くにあたっての注意点
    フォーラムのご利用方法(質問の投稿)について
    フォーラムへの回答に関するガイドラインおよびフォーラム運営について(再掲)
    ご意見、ご要望はこちらのフォーラムまで。
    各種設定方法はフォーラム内を [かんたん フォーラム ガイド] で検索してみてください。


    また、Visual C++ フォーラムが適切な投稿先と思いますので投稿先の
    移動をさせていただきます。

    > 佐祐理さん
    ご指摘ありがとうございます。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年5月30日 0:11
    モデレータ