为什么即使在非常简单的情况下,挥发性变量也没有优化?

Ale*_*k86 5 c++ optimization volatile

如果我编译代码

int main()
{
    int i;
    i = 1;
    i = 2;
}
Run Code Online (Sandbox Code Playgroud)

在具有发布和优化的VS中,反汇编看起来像:

int main()
{
    int i;
    i = 1;
    i = 2;
}
010D1000  xor         eax,eax 
010D1002  ret
Run Code Online (Sandbox Code Playgroud)

但如果我写"volatile"这个词:

int main()
{
01261000  push        ecx  
    volatile int i;
    i = 1;
01261001  mov         dword ptr [esp],1 
    i = 2;
01261008  mov         dword ptr [esp],2 
}
0126100F  xor         eax,eax 
01261011  pop         ecx  
01261012  ret   
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么VS留下这个代码?这有什么副作用吗?它是程序中唯一的代码,为什么优化器不能把它扔掉?

Som*_*ude 11

这个参考页面:

volatile - 可以通过编译器无法检测的方式修改对象,因此必须禁用某些编译器优化.


Ben*_*ley 8

如果挥发性变量可以被优化掉,那会破坏它们的目的,不是吗?将volatile放在var上告诉编译器你知道它没有的东西.这个var的某些东西可能完全超出了程序的范围.如果编译器对此进行了优化,则会破坏这些计划.


Fai*_*Dev 5

好吧因为volatile告诉编译器可以以编译器无法看到的方式访问/更改变量.通常用于嵌入式软件,例如硬件中断可以改变变量的值.