为什么这段代码需要 volatile 关键字?
Why does this code need the volatile keyword?
我找到了这段代码 here:
void work(int n) {
volatile int i=0; //don't optimize away
while(i++ < n);
}
void easy() { work(1000); }
void hard() { work(1000*1000*1000); }
int main() { easy(); hard(); }
...但我不明白为什么它需要对整数 i
使用 volatile 关键字。 (这是整个程序。)我知道 volatile 强制从主内存中读取 i
的值,但在这种情况下,因为 i
的值正在更新程序本身,为什么编译器会认为不这样做是可以的(并优化掉 while 循环)?
因为,如果没有 volatile
关键字,编译器可以自由观察循环什么都不做,并将其优化为什么都不做。 i
的值在 work()
退出后丢失,因此没有观察到 运行 循环的影响。 (即使 work()
公开该值,例如通过返回 i
,编译器仍可能将循环优化为沿 i = n
行的单个赋值。)
使用 volatile
关键字,编译器需要保留对 i
的所有访问,因此无法优化循环。
我找到了这段代码 here:
void work(int n) {
volatile int i=0; //don't optimize away
while(i++ < n);
}
void easy() { work(1000); }
void hard() { work(1000*1000*1000); }
int main() { easy(); hard(); }
...但我不明白为什么它需要对整数 i
使用 volatile 关键字。 (这是整个程序。)我知道 volatile 强制从主内存中读取 i
的值,但在这种情况下,因为 i
的值正在更新程序本身,为什么编译器会认为不这样做是可以的(并优化掉 while 循环)?
因为,如果没有 volatile
关键字,编译器可以自由观察循环什么都不做,并将其优化为什么都不做。 i
的值在 work()
退出后丢失,因此没有观察到 运行 循环的影响。 (即使 work()
公开该值,例如通过返回 i
,编译器仍可能将循环优化为沿 i = n
行的单个赋值。)
使用 volatile
关键字,编译器需要保留对 i
的所有访问,因此无法优化循环。