为什么volatile变量即使在非常简单的情况下也没有优化

why volatile vars are not optimized even in very simple cases?

本文关键字:情况下 优化 简单 非常 变量 volatile 为什么      更新时间:2023-10-16

如果我编译代码

int main()
{
    int i;
    i = 1;
    i = 2;
}

在vsrelease和优化中,反汇编看起来像:

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离开这个代码吗?有什么副作用吗?它是程序中唯一的代码,那么为什么优化器不能把它去掉呢?

从这个参考页:

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

如果volatile变量可以被优化掉,那就违背了它们的目的,不是吗?把volatile放在var上就是告诉编译器你知道它不知道的东西。这个变量可能完全超出了程序的作用域。如果编译器把它优化掉了,就会破坏这些计划。

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

volatile修饰符表示该变量很可能在编译程序的控制范围之外被更改或读取。没有什么需要优化的

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

i = 1;
i = 2;

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

相关文章: