【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)


相关推荐

  • 用户路径的分析结果_用户账号文件的路径

    用户路径的分析结果_用户账号文件的路径1.什么是用户路径分析用户行为分析是数据分析中非常重要的一项内容,在统计活跃用户,分析留存和转化率,改进产品体验、推动用户增长等领域有重要作用。单体洞察、用户分群、行为路径分析是用户行为数据分析的三大利器。用户路径分析,就是用户在APP或网站中的访问行为路径。用户行为路径分析是互联网行业特有的一类数据分析方法,它主要根据每位用户在App或网站中的点击行为日志,分析用户在App或网站中各个模块的流转规律与特点,挖掘用户的访问或点击模式,进而实现一些特定的业务用途,如App核心模块的到达率提升、特定用户群

  • pycharm快捷运行_pycharm打开python项目

    pycharm快捷运行_pycharm打开python项目秒速打开pycharm方法安装了pycharm以后,常常感觉到打开软件时非常的慢,因此,需要给pycharm分配更多的运行内存。提速方法如下首先找到pycharm安装路径下Bin文件夹中的“pycharm64.exe.vmoptions”或者“pycharm.exe.vmoptions”文件。根据自己的电脑配置(64位系统还是32位系统)选择相应的文件。其次,将-server-Xms128m-Xmx512m修改为:-server-Xms1024m-Xmx2048m最后重启pycha

  • 一文搞懂JVM内存结构

    一文搞懂JVM内存结构1.前言Java虚拟机是中、高级开发人员必须修炼的知识,有着较高的学习门槛,很多人都不情愿去接触它。可能是觉得学习成本较高又或者是感觉没什么实用性,所以干脆懒得“搭理”它了。其实这种想法是错误的。举个最简单的例子,JVM基本上是每家招聘公司都会问到的问题,它们会这么无聊问这些不切实际的问题吗?很显然不是。由JVM引发的故障问题,无论在我们开发过程中还是生产环境下都是非常常见的。比如…

  • Linux 安装tomcat 部署war包项目

    Linux 安装tomcat 部署war包项目准备工作:jdk-8u161-linux-x64.tar.gz链接:https://pan.baidu.com/s/1zQGL_cfN5jFWshZkAJOkNw密码:0u7dapache-tomcat-9.0.20.zip链接:https://pan.baidu.com/s/1Nf_qdmUVlQ0Cz8BOoQg2rA密码:bh9f以及你的war包…

  • Android程序员学习iOS

    Android程序员学习iOS开始学习iOS编程的知识,新手,对照Android开发学习1.AS里引入第三方库利用IDE可以搜索和添加,也可以直接在build.gradle里添加,利用的是gradle对在maven,jcenter库里的library可以进行检索、分析依赖以及自动下载。Xcode看来需要一个叫CocoaPods的工具2.iOS里到处都是委托,委托基于协议。比如AppDelegate,看起来

  • cmos出现问题_sensor和cmos

    cmos出现问题_sensor和cmos在某些场景下,使用者可以看到相机画面出现一条一条的滚动暗条纹,如下图片所示,这样的现象,通常是CMOSsensor曝光时间方面的因素引起的。

    2022年10月13日

发表回复

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

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