C++中 volatile
发布日期:2021-06-29 18:38:31 浏览次数:2 分类:技术文章

本文共 883 字,大约阅读时间需要 2 分钟。

文章目录

1.volatile的作用

  • 这变量可能会被意想不到改变,
    • 每次从内存中去读这个值,
    • 而不是因编译器优化从缓存的地方读取,
    • 比如读取缓存在寄存器中的数值,
    • 从而保证volatile变量被正确的读取。

  • 单任务中,函数体内部,如果在两次读取变量的值之间的语句没有对变量修改,编译器就对可执行代码优化。
  • 访问寄存器的速度要快过RAM
    • 以后只要变量的值没有改变,就一直从寄存器中读取变量的值,
    • 而不对RAM访问。

  • 多任务中,虽然在一个函数体内部,在两次读取变量之间没有对变量的值进行修改,但是该变量仍然有可能被其他的程序(如中断程序、另外的线程等)修改。
  • 如下程序对这一现象进行了模拟。
#include 
using namespace std;int main(int argc,char* argv[]){
int i=10; int a=i; cout<
<
  • TMD,输出10,10

  • 以上代码须在Release模式下考查,只有Release模式下才对程序代码优化,

    • 而这种优化在变量共享的环境下容易引发问题。

在这里插入图片描述

  • 我通过查看汇编代码发现应该是 mov dword ptr [ebp-8],80

在这里插入图片描述

  • b=i;之前,已通过内联汇编代码修改了i
    • 但变化没反映到b,若i是一个被多个任务共享的变量,这种优化带来的错误是致命。

如何抑制编译器对读取变量的这种优化,来防止错误读取呢?

  • 将i前申明为volatile即可
#include 
using namespace std;int main(int argc,char* argv[]){
volatile int i=10; int a=i; cout<
<
  • TMD,输出10,80
  • 第二次读取变量i的值的时,已经获得了变化之后的值。
  • 跟踪汇编代码可知,凡申明为volatile的变量,每次都是从内存中读取变量的值,而不是在某些情况下直接从寄存器中取值。

2.volatile应用场景

参考链接下次记得继续抄

转载地址:https://cyj666.blog.csdn.net/article/details/103244755 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:计清:6 传输层
下一篇:FalseSharing

发表评论

最新留言

不错!
[***.144.177.141]2024年05月02日 14时18分34秒