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

时间:2011-11-23 21:01:31

标签: c++ optimization volatile

如果我编译代码

int main()
{
    int i;
    i = 1;
    i = 2;
}
在具有发布和优化的VS中,反汇编看起来像:

int main()
{
    int i;
    i = 1;
    i = 2;
}
010D1000  xor         eax,eax 
010D1002  ret

但如果我写下“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   

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

5 个答案:

答案 0 :(得分:11)

来自this参考页:

  

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

答案 1 :(得分:8)

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

答案 2 :(得分:5)

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

答案 3 :(得分:4)

volatile修饰符表示变量可能会在编译时更改或在程序控制之外读取。没有什么可以优化的。

答案 4 :(得分:2)

如果将i映射到附加板上的寄存器,编译器对其内容进行假设将是非常糟糕的。

i = 1;
i = 2;

这可能是向一块硬件发出命令。跳过命令'1'可能会产生一些非常糟糕的结果。