【C++】volatile关键字的作用「建议收藏」

【C++】volatile关键字的作用「建议收藏」volatile的作用volatile关键字是防止在共享的空间发生读取的错误。只保证其可见性,不保证原子性;使用volatile指每次从内存中读取数据,而不是从编译器优化后的缓存中读取数据,简单来讲就是防止编译器优化。在单任务环境中,如果在两次读取变量之间不改变变量的值,编译器就会发生优化,会将RAM中的值赋值到寄存器中;由于访问寄存器的效率要高于RAM,所以在需要读取变量时,直接寄存器中…

大家好,又见面了,我是你们的朋友全栈君。

volatile的作用

volatile关键字是防止在共享的空间发生读取的错误。只保证其可见性,不保证原子性;使用volatile指每次从内存中读取数据,而不是从编译器优化后的缓存中读取数据,简单来讲就是防止编译器优化。

在单任务环境中,如果在两次读取变量之间不改变变量的值,编译器就会发生优化,会将RAM中的值赋值到寄存器中;由于访问寄存器的效率要高于RAM,所以在需要读取变量时,直接寄存器中获取变量的值,而不是从RAM中。

在多任务环境中,虽然在两次读取变量之间不改变变量的值,在一些情况下变量的值还是会发生改变,比如在发生中断程序或者有其他的线程。这时候如果编译器优化,依旧从寄存器中获取变量的值,修改的值就得不到及时的相应(在RAM还未将新的值赋值给寄存器,就已经获取到寄存器的值)。

#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
    int i=10;
    int a=i;
    cout<<a<<endl;
    _asm
    {
        mov dword ptr [ebp-4],80
    }
    int b=i;
    cout<<b<<endl;
}

输出结果:

10
10 

注:必须在Release版本在,在Release才会对代码进行优化 

要想防止编译器优化,就需要在声明变量i时前加volatile关键字,就会输出 10 80;加关键字后,就在RAM中读取变量的值,而不是直接在寄存器中取值

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138439.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 学习笔记:Oracle dul数据挖掘 使用DUL数据恢复软件恢复分区表中

    学习笔记:Oracle dul数据挖掘 使用DUL数据恢复软件恢复分区表中

  • 小数和二进制的转换_进制转换表

    小数和二进制的转换_进制转换表1.小数用二进制如何表示首先,给出一个任意实数,整数部分用普通的二进制便可以表示,这里只说小数部分如何表示例如0.6文字描述该过程如下:将该数字乘以2,取出整数部分作为二进制表示的第1位;然后再将小数部分乘以2,将得到的整数部分作为二进制表示的第2位;以此类推,知道小数部分为0。特殊情况:小数部分出现循环,无法停止,则用有限的二进制位无法准确表示一个小数,这也是在编程语言中表

    2022年10月31日
  • pfx 证书导出公钥和私钥「建议收藏」

    pfx 证书导出公钥和私钥「建议收藏」pfx证书导出公钥和私钥在做银联支付的时候,因为是多商户的,所以采用单独的私钥加密,需要提取pfx中的私钥准备准备pfx格式的证书[root@blueacp_crt]#tree.├──acp_test_sign.pfx提取密钥对格式:opensslpkcs12-inacp_test_sign.pfx-nocerts-nodes-outacp_test_sign.key[root@blueacp_crt]#opensslpkcs12-inacp_t

  • 关于【ExecuteReader: Connection 属性尚未初始化】的错误提示解决方案「建议收藏」

    关于【ExecuteReader: Connection 属性尚未初始化】的错误提示解决方案「建议收藏」遇到这种错误,很大概率是因为缺少SqlCommand里的两个参数。找到【SqlCommandmycmd=newSqlCommand();】这条语句,SqlCommand()有两个带传入的参数:一个是定义查询语句的sql, 另一个是定义数据库连接的conn以下为部分代码片段,仅供理解:stringsql=”select*fromInformationwhereUsername='”+Username+”‘andPassword='”+Passw.

  • ubuntu常用软件包deb的安装与卸载

    ubuntu常用软件包deb的安装与卸载【更详细得教程,以及获取软件包,关注公众号木石说:mushiwords。回复‘ubuntu’关键字即可免积分免费获取Ubuntu下软件包列表】。Ubuntu下的软件管理主要使用的是apt-get(现在广泛使用的是apt)以及dpkg两个管理工具,apt可以说是apt-get的升级版本,Ubuntu16.04发布时,一个引人注目的新特性便是apt命令的引入,之后越来…

  • js有哪些异步操作_js单线程怎么实现异步

    js有哪些异步操作_js单线程怎么实现异步JS常用的几种异步流程控制

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号