web-dev-qa-db-ja.com

なぜ#pragma optimize( ""、off)

C++ MFCプロジェクトをレビューしています。一部のファイルの先頭には、次の行があります。

#pragma optimize("", off)

これにより、以下のすべての関数の最適化がオフになることがわかります。しかし、そうするための動機は通常何でしょうか?

17
Stokke

正しいが複雑なので、オプティマイザが誤った出力を生成するのを混乱させる生成コードを見たことがあります。これが、最適化をオフにする理由である可能性があります。

ただし、コードにバグがあり、未定義の動作が発生している可能性が高いと思います。オプティマイザはそれを公開し、不正なランタイム動作またはクラッシュを引き起こします。最適化がなければ、コードはたまたま「機能」します。そして、根本的な問題を見つけて取り除くのではなく、誰かが最適化を無効にしてそのままにしておくことで「修正」しました。

もちろん、これは脆弱であり、回避策がとれる程度のものです。新しいハードウェア、新しいOSパッチ、新しいコンパイラパッチ、これらのいずれかがそのような「修正」を破る可能性があります。

最初の理由でプラグマが存在する場合でも、詳細に文書化する必要があります。

17
Angew

アプリケーションの残りの部分が最適化を有効にしてコンパイルされている特定のコードセットでより良いデバッグ情報を取得するために、これを排他的に使用しました。これは、アプリケーションのパフォーマンス要件のために完全なデバッグビルドで実行できない場合に非常に役立ちます。

26
Ray

これらがコードベースに含まれる別の代替理由...それは偶然です。

これは、レイが前述したように、デバッグ中に特定のファイルのオプティマイザをオフにするための非常に便利なツールです。

コミットする前にチェンジリストを注意深くレビューしないと、他の変更がコミットされたときに「誤って」そこにあったために、これらの行がコードベースに入るのは非常に簡単です。

8
JoshG

これは古いトピックであることはわかっていますが、このディレクティブを使用する別の理由があることを付け加えます。ただし、ほとんどのアプリケーション開発者には関係ありません。

デバイスドライバーまたはその他の低レベルコードを作成するとき、オプティマイザーがハードウェアと正しく相互作用しない出力を生成することがあります。

たとえば、割り込みをクリアするためにメモリマップドレジスタを読み取る必要がある(ただし、読み取り値を使用しない)コードは、コンパイラによってoptimized outになり、機能しないアセンブリコードを生成する可能性があります。

これはまた、(Angewによると)このディレクティブの使用を明確に文書化する必要がある理由を示している場合もあります。

5
Dwight