为什么volatile变量即使在非常简单的情况下也没有优化
why volatile vars are not optimized even in very simple cases?
如果我编译代码
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'可能会导致一些非常糟糕的结果。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 在这种情况下,编译器会进行优化吗?
- 当 95% 情况下的值为 0 或 1 时,对非常大的数组进行随机访问的任何优化
- 在没有返回值优化的情况下将两个对象加在一起时,将创建多少个临时对象
- 默认情况下在CMAKE中进行优化
- 在代码优化过程中,C++11编译器是否会在可能的情况下将局部变量转换为右值
- 在这种情况下,为什么QMAKE添加-O1和-O2优化标志
- C 控制台应用程序;在牙科诊所情况下,时间优化了队列
- 如何消除只在启用优化的情况下出现的错误
- 程序在没有调试符号的情况下崩溃,运行良好(两种情况下都没有优化或任何内容)
- Visual Studio 2013 在存在 /OPT:ICF 的情况下是否进行了正确优化?
- 如何在没有调试符号和优化的情况下创建 cmake 构建配置
- 有没有办法告诉 clang 在没有其他优化的情况下生成 TBAA 元数据
- 编译器是否在返回成员变量的情况下执行返回值优化
- 在这种情况下,我如何优化一对的结构
- 为什么Visual Studio在这种情况下不执行返回值优化(RVO)
- 如何在VC++2015全程序优化的情况下正确地从dll中公开接口
- 为什么volatile变量即使在非常简单的情况下也没有优化
- 如何在不完全重新加载每帧每个像素的情况下更改图像的 alpha 值/ 优化