我找到了这段代码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循环)?
答案 0 :(得分:10)
因为没有volatile
关键字,编译器可以自由地观察到循环什么也不做,并将其优化为零。 i
退出后work()
的值丢失,因此运行循环没有可观察到的影响。 (即使work()
要公开该值,例如通过返回i
,编译器仍然可以将循环优化为i = n
的单个赋值。)
使用volatile
关键字,编译器需要保留对i
的所有访问,因此无法优化循环。