为什么这段代码需要volatile关键字?

时间:2016-05-07 17:49:25

标签: c volatile

我找到了这段代码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循环)?

1 个答案:

答案 0 :(得分:10)

因为没有volatile关键字,编译器可以自由地观察到循环什么也不做,并将其优化为零。 i退出后work()的值丢失,因此运行循环没有可观察到的影响。 (即使work()要公开该值,例如通过返回i,编译器仍然可以将循环优化为i = n的单个赋值。)

使用volatile关键字,编译器需要保留对i的所有访问,因此无法优化循环。