コンパイラの最適化について聞いた。
たとえば、次の場合です。
while(myBool)
doStuff();
コンパイラは、whileループ内でmyBoolを変更しないことを認識しています。コンパイラは、myBoolを1回読み取るだけで、毎回チェックするわけではありません。
これはvolatile
キーワードの影響を受ける可能性がありますか?
だから私はコンパイラを「だまして」みましたが、値は変更されていないと思います。
int main()
{
struct st
{
int a;
int b; //I want to make difference by writing volatile here
}s;
s.b = 1;
while(s.b > 0)
{
*((&s.a)+1) = 0;
std::cout << "test" << std::endl;
}
}
しかし、完全な最適化がオンになっている場合でも(vs2012)、これはコンパイラーをだましません。これはおそらく非常に不完全なトリックです:)
どうすればそれをだますことができますか?それも可能ですか?
私の目標は、キーワードを使用して「test」を出力し、volatile
キーワードを使用せずに「test」を無限に出力する、単純なシングルスレッドプログラムを作成することです。
編集:残念ながら、私はアセンブラが苦手なので、メモリの読み取りが最初に最適化されていると、本当に読み取ることができません:)