0

コンパイラ: Visual C++ 2012 RTM

バグかどうか?: https://connect.microsoft.com/VisualStudio/feedback/details/763601/visual-c-2012-rtm-serious-compiler-bug

私には、test() の呼び出しを 2 番目の std::cout ステートメントにインライン化するのは奇妙に思えます。

4

2 に答える 2

8

はい。コンパイラは、プログラムに検出されない変更を自由に行うことができます。関数には外部から見える影響がないためtest、コンパイラは自由に好きなだけ早くまたは遅く作成したり、完全に削除したりすることができます。

この最適化によって、コードがすべきでないことを実行するようになった理由を説明できる場合は、何かが得られます。しかし、これまでのところ、あなたの唯一の主張は、コードの実行が遅くなったり速くなったりしたということです。コンパイラは、コードの一部を遅くしたり一部を高速にしたりする最適化を自由に行うことができます。実際、それが最適化の本質です。パフォーマンスのトレードオフを行うことで、純利益が得られることを願っています。これにより、生成されたコードの品質が低下する可能性がありますが、この場合はそうではないように見えますが、最も確実に有効です。それが最適化のすべてです。

コンパイラはソース コードを受け取り、出力コンパイル済みコードを生成します。ソースコードが生成するように要求する観察可能な結果を​​生成する限り、好きなコンパイル済みコードを自由にビルドできます。より良いと思われる方法で同じ効果を生成する方法を見つけられる場合は、ソース コードと同じ方法で出力を生成する必要はありません。これが最適化の要点です。要求したことを文字通り実行するのではなく、別の方法で同じ結果を生成することです。

于 2012-09-20T09:10:33.480 に答える
3

それは as-if ルールに帰着します。コンパイラは、外部の動作が変換前の動作と区別できない限り、適切と思われる方法でプログラムを自由に変換できます。

ルールのより正確な定式化については、こちらを参照してください。volatile へのアクセスはこの定義に含まれていることに注意してください。したがって、volatility を変更すると違いが見られます。

于 2012-09-20T09:19:54.207 に答える