为什么这段代码需要 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 的所有访问,因此无法优化循环。