如果我编译代码
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会留下这段代码?这有什么副作用吗? 它是程序中唯一的代码,为什么优化器不能把它扔掉?
答案 0 :(得分:11)
来自this参考页:
volatile - 可以通过编译器无法检测的方式修改对象,因此必须禁用某些编译器优化。
答案 1 :(得分:8)
如果挥发性变量可以被优化掉,那会破坏它们的目的,不是吗?将volatile放在var上告诉编译器你知道它没有做什么。这个var的某些东西可能完全超出了程序的范围。如果编译器对此进行了优化,则会破坏这些计划。
答案 2 :(得分:5)
因为volatile
告诉编译器可以以编译器无法看到的方式访问/更改变量。通常用于嵌入式软件,例如硬件中断可以改变变量的值。
答案 3 :(得分:4)
volatile
修饰符表示变量可能会在编译时更改或在程序控制之外读取。没有什么可以优化的。
答案 4 :(得分:2)
如果将i
映射到附加板上的寄存器,编译器对其内容进行假设将是非常糟糕的。
i = 1;
i = 2;
这可能是向一块硬件发出命令。跳过命令'1'可能会产生一些非常糟糕的结果。