明白volatile的意义

在C++编程中,很少会用到volatile变量,所以很多人并不清楚volatile变量的意义。其实volatile关键字是用于告诉编译器,它所声明的变量的内存位置是一块特殊内存,而非普通内存。
而何为普通内存呢?让我们来看一下以下代码:
int x = 10;
int y = x;
y = x;
对于以上代码,其实第二次”y = x;”的调用是多余,编译器实际上很有可能会将这段代码进行优化,优化后可能的情况就是:
int x = 10;
auto y = x;
第二次对y的赋值直接删除了,因为这是没有意义的。
而对于以下代码:
x = 10;
x = 20;
对x的第一次赋值后,紧接着又对x进行重新赋值。因此第一次赋值就是不必要的,因为它在使用前又被重新赋值了。所以编译器会就将第一次赋值优化掉,只留下20那次赋值。
但假如x是volatile变量,那编译器则不会进行这样的优化,因为volatile变量意味着它是一块特殊的内存,它有可能不是指RAM的某个地址,而是对应了某个外接设备的端口,其中最常见的是memory mapped I/O。这是对y的两次赋值的意义就不同了,第二次赋值就相当于第二次读取,这是读到的结果有可能与第一次读取时不一致的;而后续对x的两次赋值也都有了特殊的意义。因此,编译器便需要对它进行特殊的对待,而不能直接优化掉第二次的赋值。
总之而言,volatile关键字就是告诉编译器,这里处理的不是普通内存,不要对这个变量使用任何的优化。所以当我们处理类似于memory mapped I/O时,我们就应该使用volatile声明,以避免编译器的优化所带来的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值