volatile关键字

volatile关键字

编译器对代码的优化

int main()
{
  int  i = 0;
  i++;
  cout << "hello world!" << endl;
}

按照代码,这个程序会在内存中预留int大小的空间,初始化这段内存为0,然后这段内存中的数据加1,最输出hello world!到标准输出中。但是根据这段代码编译出来的程序(加-O2选项),不会预留int大小的内存空间,更不会对内存中的数字加1。它只会输出hello world!到标准输出中。
其实不难理解,这个就是编译器为了优化代码,修改了程序的逻辑。实际上C++标准是允许写出来的代码和实际生成的程序是不一致的。虽说优化代码是件好事,但是也不能让编译器任意修改程序的逻辑,不然的话我们没办法编写可靠的程序了。所以C++对这种逻辑的改写是有限制的,这个限制就是在编译器修改逻辑后,程序对外界的IO依旧是不变的。怎么理解呢?实际上我们可以把写出来的程序看作是一个黑匣子,如果按照相同的顺序给出同样的输入,它就每次都会以同样的顺序给出同样的输出。这里的输入输出包括了标准输入输出、文件系统、网络IO、甚至一些system call等等,所有程序外部的事情都包含在内。所以对于程序使用者来说,只要两个黑匣子的输入输出是完全一致的,那么这两个黑匣子就是一致的,所以编译器可以在这个限制下任意改写程序的逻辑。

volatile说明符告诉编译器,该对象可能会被第三方修改,尽管在编程语言中并没有主动修改过该对象。所以编译器要避免任何对该对象的优化行为。

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素修改,比如:操作系统、硬件或者其他线程等。遇到这个关键字声明的变量,编译器对访问该变量 的代码不再进行优化,从而可以提供对特殊地址的稳定访问。声明语法时:int volatile vlnt;当要求是用
volatile声明的变量的值的时候,系统总是重新从它所在的内从读取数据,即使它面前的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

volatile int iNum = 10;
volatile指出iNum是随时可能发生改变的,每次使用它的时候必须从原始内存地址中去读取。而不是只要编译器发现iNum的值没有发生变化,就只读取依次数据,并放入寄存器中去取值,而没有重新从内存中去读取。

一般来说,volatile可能用在的地方:

  1. 多任务环境下各任务的共享的标志应该加volatile
  2. 未完待续
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值