【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中读取变量的值,而不是直接在寄存器中取值

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • layui弹出层提交表单![通俗易懂]

    layui弹出层提交表单![通俗易懂]本文章使用layui框架,提交表单,如果使用其他的框架请右上角!首先设置弹出层如下图:layer.open({ type:2, title:"信息編輯", area:[‘45%’,’35%’], shade:0, sha…

    2022年5月6日
    587
  • vdbench使用

    vdbench使用简介vdbench是一个I/O工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具,容易使用,而且常常用于测试和基准测试。可以使用vdbench测试磁盘和文件系统的读写性能。名词解释vdbench中常用的一些名词解释:HD主机定义SD存储定义WD工作负载定义RD运行定义FSD文件系统存储定义FWD文件工作负载定义安装和配置linux下配置vdbench(1)下载Vdbench…

    2022年5月12日
    291
  • 计算机类单位换算,计算机单位换算大全「建议收藏」

    计算机类单位换算,计算机单位换算大全「建议收藏」电脑世界是由0与1组成,其中有数以万计的线路,一条线路传递一个信号,而0代表没有信号,1代表有信号,就像电源开关一样,同一时间只可能有一种状态,所以电脑最基本的单位就是一条线路的信号,我们就把它称作“位”,英文叫做bit,缩写为b。“位”和“字节”其实都是电脑的计量单位,我们可以理解成字节是由位组成的,一个“字节”等于8“位”,Byte是它的缩写.位(bit)这个单位太小,所以字节(Byte)是…

    2022年7月27日
    1
  • HorizontalScrollView+TabLayout+ViewPager+XUtils「建议收藏」

    HorizontalScrollView+TabLayout+ViewPager+XUtils「建议收藏」利用HorizontalScrollView+TabLayout+ViewPager+XUtils简单实现一个小Demo;首先配置环境:添加权限:添加依赖:记得添加Gson的jar包 还有个XUtils的依赖:compile’org.xutils:xutils:3.5.0’下来是布局:activity_main

    2022年7月14日
    24
  • input.nextInt();简单使用讲解

    input.nextInt();简单使用讲解完整的写法是先导入输入流类Scannerimportjava.util.Scanner;然后使用输入流,按照你的问题中的写法名称应该这样使用Scanner这个类Scannerinput=newScanner(System.in);//创建输入流对象inputintuserNum=input.nextInt();//使用输入流对

    2025年7月3日
    0
  • 华为服务器安装nas系统,云服务器搭建nas

    华为服务器安装nas系统,云服务器搭建nas云服务器搭建nas内容精选换一换在云服务器上搭建网站后,部分客户通过本地网络访问网站时出现偶发性无法访问的情况。确认客户使用的本地网络。若客户的本地网络是NAT网络(本地主机通过NAT功能使用公网IP地址访问弹性云服务器),可能会导致该问题。若客户的本地网络是NAT网络(本地主机通过NAT功能使用公网IP地址访问弹性云服务器),可能会导致该问题。执行以下命令,查看搭建网在云服务器上搭建网站后,部…

    2022年6月15日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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