【C++】volatile关键字

2023-10-30

我们都知道当使用编译器时候,编译器会为我们的代码做出一些优化。关于validate关键字的功能和原理我们将用一个例子来给出解释。

功能:当一个变量被volidate关键字修饰时,意味着当我们每次使用这个变量时都会从变量所在的内存中去获取。而不使用编译器为我们优化后保存在cpu寄存器中的备份。接下来举个例子给大家说明下。

例子:假设在某一个线程中有如下的程序代码,
 

...
int a = 9;
int b = a;
int c = a;
...

这里我们首先给定变量a的值,然后使用a的值初始化b,紧接着在使用a值初始化c。在这里代码执行的时候,编译器会为我们的程序做出一个优化:首先执行b = a后,这时从内存是将a的值取出来给b。由于本程序自己没有对变量修改,这时会把a的值放入到cpu的寄存器中,以后读取的时候直接使用cpu寄存器中的副本,而不是在次访问内存读取数据。这样可以起到优化的作用提高读取的速度。另外我们要知道,用户状态是不允许修改cpu寄存器中的值。
但是这样做就会产生一个潜在的隐患,当执行完b = a后,cpu的寄存器中就会有一个变量a值的副本以便在以后的访问中使用。但是可能另外一个线程对a的值(程序自己不修改变量,但是程序之外的东西可能会对数据a进行修改)进行改变,然后将改变后的值写入到内存中去。但是当前线程不知道这个值发生了改变,不会更新cpu寄存器中的副本(用户状态是不允许修改cpu寄存器中的值),执行c = a的时候直接从寄存器中读取未发生改变的值,但是此时内存中的值已经发生了改变,获取的值不是真正意义上的值。

volidate关键字就是为了解决这个问题的,不论何时都从内存中读取数据,不使用编译器的优化后的值。当然由于volidate是每次访问都从内存中读取,这必定会造成效率下降的问题。

常见问题:
question1:一个变量为什么既可以使用volidate修饰,也可以使用const修饰?

答:这两个关键字从字面意思看像是对立的,volidate说明这个变量是“易变”的,而const说明这个变量是“不变”地。从字面上看这两个关键字相互矛盾的,但是但是究其本质,我们会发现这两个关键字起到了增强效果的作用。volidate关键字说被修饰的变量是“易变”的,每次都要改,这时只要从变量所在的内存中读取。因为变量可能可能被本程序(变量所在的程序)之外的东西(如操作系统、其他线程等)发生意想不到的修我们每次都从变量内存中读取,就会获得变量的真实值(如果没有volidate关键,编译器优化可能会引发灾难)。const关键字只是说明被修饰的变量不能在本程序内被修改,但是本程序之外还是有可能修改改变量的,比如其他线程修改。


转载源:C++中volidate关键字 (题目标题错误)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】volatile关键字 的相关文章

  • 【C++】Lambda表达式

    C 11的一大亮点就是引入了Lambda表达式 利用Lambda表达式 可以方便的定义和创建匿名函数 对于C 这门语言来说来说 Lambda表达式 或 匿名函数 这些概念听起来好像很深奥 但很多高级语言在很早以前就已经提供了Lambda表达
  • c++智能指针和普通指针之间相互转换

    include
  • 【C++】error LNK2019: 无法解析的外部符号

    转 C error LNK2019 无法解析的外部符号 错误解决方案 今天在实现类模板特例化的时候遇到一个问题 就是把类模板函数实现放到类的cpp文件中 然后在main函数中使用这个类的时候 就会出现无法解析的外部符号 函数名 xxxx 等
  • $.post 提交长度过大问题

    Json 参数长度过大 无法反序列化为Json
  • 【OpenCV】噪声的添加和过滤

    1 简介 下面简单介绍两种图像噪声 即椒盐噪声和高斯噪声 1 椒盐噪声 椒盐噪声也称脉冲噪声 它是一种随机出现的白点或者黑点 可能是亮的区域有黑色像素或是在暗的区域有白色像素 或是两者皆有 图像模拟添加椒盐噪声是通过 随机获取像素点 并设置
  • 【C++】异常处理

    一 什么是异常处理 一句话 异常处理就是处理程序中的错误 二 为什么需要异常处理 以及异常处理的基本思想 C 之父Bjarne Stroustrup在 The C Programming Language 中讲到 一个库的作者可以检测出发生
  • c++模板与泛型编程

    函数模板 template
  • c++类模板与继承

    继承中父子类和模板类的结合情况 1 父类是一般类 子类是模板 类 2 父类是模板类 子类是一般类 3 父类和子类都是模板类 1 include
  • C++之函数重载

    目录 1 函数重载 2 函数重载的概念 3 编译器的工作 4 判断函数重载的规则 1 函数的重复声明 2 参数表的比较过程与形参名无关 3 如果在两个函数的参数表中 4 相同的参数列表 5 形参是按值传递方式定义 6 参定义指针或引用 7
  • 【C++笔记】C++11常用特性的使用经验总结

    转载 https www cnblogs com feng sc p 5710724 html title12
  • 【C++】运算符重载 一

    C 允许在同一作用域中的某个函数和运算符指定多个定义 分别称为函数重载和运算符重载 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明 但是它们的参数列表和定义 实现 不相同 当您调用一个重载函数或重载运算符时 编译
  • C++模板重载

    C 模板重载 产生背景 需要多个对不同类型使用同一种算法函数时可以使用模板 但是并非所有的类型都使用同一种算法 为了解决这个问题 产生了模板重载 Tips 1 如同函数的重载一样 模板重载函数的特征标必须不同 2 并非所有的模板参数都必须是
  • C++初探 5-1(for循环)

    目录 注 for循环 for循环的组成部分 1 表达式和语句 2 非表达式和语句 3 修改规则 for循环的使用例 阶乘的计算与存储 修改循环更新的步长 使用for循环访问字符串 递增运算符 和 递减运算符 副作用和顺序点 前缀格式和后缀格
  • C#输入输出

    目录 一 函数介绍 二 C 中输入输出的一些例子 一 函数介绍 C Console 类主要用于控制台应用程序的输入和输岀操作 Console Read 和Console ReadLine 的区别在于 前者读取是根据空白符隔开且返回int类型
  • C语言--八大排序之直接插入排序算法

    排序 把无序的数据变得有序 默认升序 笔试面试排名第一的内容 1 直接 简单 插入排序 例如 扑克牌发牌时 每发一张 将牌有序插入 从当前位置开始 从后往前找比当前数字小的 找到后插入到这个小的数字后面 在找的过程中 如果发现一个比当前数字
  • C# new与malloc

    目录 C new与malloc C new与malloc的区别 C new关键字底层做的操作 C new与malloc new关键字 new关键字在C 中用于实例化对象 并为其分配内存 它是面向对象编程的基本操作之一 使用new关键字可以在
  • 【C++ 并发与多线程】std::thread类-为共享数据加锁 2

    正交 消除无关事务之间的影响 力求高内聚低耦合 死锁的概念略去不说 死锁有可能发生在使用多个互斥量的场景下 也可能存在没有使用互斥量的场景 两个线程都在等待对方释放互斥量 两个线程都调用了对方的join 函数 为了解决两个线程都在等待对方释
  • C语言用牛顿迭代法和二分法递归求解三元一次方程

    求解方程 2x 3 4x 2 3x 6 0 牛顿迭代法 牛顿迭代法公式 以下图片均来源于百度 牛顿迭代法用递归实现解三元一次方程 include
  • C++面试题之继承

    目录 设计一个类型 不能在外部环境中创建该类的对象 设计一个不能被继承的类 设计一个不能被继承的类 但可以在外部环境创建该类型的对象 设计一个能被继承的类 但不能在外部环境创建该类型的对象 限制派生类对象不可以拷贝和赋值如何实现 设计一个类
  • 函数重载 隐藏 重写 覆盖

    重载 Overload 重载是比较容易弄明白的 定义 重载是指不同的函数使用相同的函数名 但是函数的参数个数或类型不同 参数列表不同 调用的时候根据函数的参数来区别不同的函数 函数重载跟返回值无关 规则 函数名相同 必须具有不同的参数列表

随机推荐

  • 如何发送和接收RTP封包的H264,用FFmpeg解码

    这篇文章给大家介绍怎么打包H264分片到RTP包 并且实现一个播放程序演示接收RTP包和用FFmpeg解码 为了让大家更了解H264打包成RTP的细节 有必要罗嗦一下向大家介绍一些相关的基础知识 下面分三节介绍 其中前面两节是基础知识 第三
  • android setWebChromeClient和setWebViewClient的使用区别

    开发中我发现两个控件的使用 由于我做的开发依旧是前期开发 所以功能比较简单 在这里我使用的webView空间一般是使用的如下这个方法 webView setWebViewClient new webViewClient 然后新建一个内部类实
  • c++ 编码转化

    UTF 8到GB2312的转换 char U2G const char utf8 int len MultiByteToWideChar CP UTF8 0 utf8 1 NULL 0 wchar t wstr new wchar t le
  • 软件测试入门第一步【测试用例】

    测试用例 是指对一项特定的软件产品进行测试任务的描述 体现测试方案 方法 技术和策略 内容包括测试目标 测试环境 输入数据 测试步骤 预期结果 测试脚本等 并形成文档 每个具体测试用例都将包括下列详细信息 编制人 审定人 编制日期 版本 用
  • git-自动化脚本

    首先我们要从https github com github 上申请一个GitHub仓库 过程就不介绍了 现在我们来写个git的自动回滚脚本 通过版本号来回滚代码 cat usr local src git sh bin bash autho
  • Kafka日志告警关键字

    在配置Kafka日志告警时 可以关注以下关键字 ERROR 表示发生了错误 需要进一步检查错误消息以确定具体的问题 Exception 表示发生了异常情况 需要进一步检查异常信息以确定具体的问题 Failed 表示操作失败 如消息发送失败
  • Set的常见用法详解(STL)新手入门!!!

    目录 1 2 Set的常见用法详解 1 set的定义 2 set容器内元素的访问 3 set的常见用途 1 2 Set的常见用法详解 前言 set翻译为集合 是内部自动有序且不含重复元素的容器 当需要去除重复元素且可能因为这些元素比价大或者
  • mysql alter语句用法:增加字段、修改字段、删除字段等

    文章目录 1修改表名 修改字段数据类型 修改字段名 增加字段 删除字段 1修改表名 alter table 旧表名 rename 新表名 修改字段数据类型 alter table 表名 modify 属性名 数据类型 要修改的部分 修改为你
  • 每天下午5点使用计算机结束时断开终端的连,在每天下午5点使用计算机结束时断开终端的连接属于()...

    相关题目与解析 在每天下午5点使用计算机结束时断开终端的连接 这种方式属于保护 A 外部终端的物理安全B 通 在每天下午5点使用计算机结束时断开终端的连接属于 对于外部计算机终端的安全管理 以下正确的是 允许在一台主机上同时连接多个终端 各
  • 华为手机计算机删除怎么恢复出厂设置,华为手机恢复出厂设置能彻底清除垃圾吗? 恢复出厂怎么操作...

    1 华为手机恢复出厂设置能不能彻底清除垃圾是根据机主的备份而定的 2 安卓手机恢复出厂设置只能清除手机本机内存中的垃圾 并且会把所有手机上的数据 应用 信息 资料等都会清除的 而在外置内存卡上反而会增加不少不能使用的垃圾文件 3 华为手机恢
  • 揭秘数据探查:引领企业数据治理质量提升,助力业务高速发展!

    在日常工作中 产品 运营 研发及数据分析师常常会发现 处理 加工和识别数据等数据处理工作往往会占用整个工作流程80 的时间 造成这种困境的原因 大致有三点 1 数据量大且混乱 数据质量参差不齐 2 整体概括信息缺乏 度量信息如最大值 最小值
  • 优雅的关闭socket

    http blog sina com cn s blog 4dbcd2730100v5cu html 转载于以上网址 我们在利用IOCP 完成端口 进行程序设计的时候 经常要关闭一些不满足条件的套接字 假如我们直接采用closesocket
  • Vuforia——环境配置

    开发环境 Unity 2021 1 14flc1 Vuforia Engine AR 9 8 8 开发前要注意先配好Git 否则Vuforia插件无法导入 配置Vuforia 2021版本没有内置Vuforia 我也尝试去Asset Sto
  • 原生JS实现评论功能

    利用js的追加 appendChild实现评论
  • Android studio项目目录结构

    Android studio项目目录结构 一 gradle目录 二 idea目录 三 moudle App 目录 1 build目录 2 libs目录 3 src目录 1 AndroidTest 2 Java 3 res A 资源介绍 图片
  • Qt信号槽传递自定义结构体

    1 定义结构体并注册元对象 1 定义结构体 struct Student int m id int m age QString m name 2 注册元对象 Q DECLARE METATYPE Student class MainWind
  • git命令行提交文件

    命令行提交文件 git init 初始化创建 git文件 git add 添加所有需要提交的文件 git commit m 初始化 提交添加的文件到本地 git remote add origin git地址 与远程github建立链接 g
  • Java给定一个正整数n,求1+2+3+...+n之和并输出。

    package com haitong homeworktwo import java util Scanner public class One public static void main String args System out
  • python excel修改数据库_【超详细】用Python行云流水地操作Excel和数据库

    前言 本想就着这个机会学习下Java读取Excel的 奈何搜了一圈 发现还是Pandas最为简单明了 打算先就Python写一版 后面在学习时可能还会发一篇 用Java优雅地操作Excel和数据库 准备工作 软件包 关于软件安装和环境配置
  • 【C++】volatile关键字

    我们都知道当使用编译器时候 编译器会为我们的代码做出一些优化 关于validate关键字的功能和原理我们将用一个例子来给出解释 功能 当一个变量被volidate关键字修饰时 意味着当我们每次使用这个变量时都会从变量所在的内存中去获取 而不