volatile 第一次接触时,对这个修饰符不是很理解,后慢慢的就理解了,
首先弄懂什么是编译器的优化:

int a;
a = 0;
a = 1;
a = 2;

上面那段代码,在编译器看来就只会编译a = 2;对其他的赋值会选择性的忽略,不在编译,简单来说,就是编译器对这段代码作了优化
volatile 的作用是让编译器不进行优化, 然后编译器依次去编译这些语句,产生四条机器码,如果被优化了,就只会产生 1条机器码
下面来看volatile 官方给的解释:
volatile是一个特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值

还有一个小的知识点就是 :对寄存器的访问要快过对RAM的,访问,所以也就是如果你不加volatile的话,就只可能从寄存器中读取缓存,而不会选择从RAM中读取,加了volatile之后就是说,会直接到RAM中去调用自己需要的值,滤过到cache中去读取缓存的值

以下是经常用到的几个地方(百度百科截取):
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义

下一个 就是register的修饰符(百度百科截取,目前基本是已经放弃使用了):
但是使用register修饰符有几点限制。
首先,register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。
其次,因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。
由于寄存器的数量有限,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。
在某些情况下,把变量保存在寄存器中反而会降低程序的运行速度。因为被占用的寄存器不能再用于其它目的;或者变量被使用的次数不够多,不足以装入和存储变量所带来的额外开销。
早期的C编译程序不会把变量保存在寄存器中,除非你命令它这样做,这时register修饰符是C语言的一种很有价值的补充。然而,随着编译程序设计技术的进步,在决定哪些变量应该被存到寄存器中时,C编译环境能比程序员做出更好的决定。实际上,许多编译程序都会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令

C 回顾 volatile 和 register 修饰符相关推荐

  1. 开课吧Java课堂:Transient和volatile修饰符如何运用

    Java定义了两类有趣的修饰符:transient和volatile,这些修饰符用来处理特殊的情况.如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: class T { ...

  2. 1.15 Java访问控制修饰符(public、 private、protected 和 friendly)

    在 Java 语言中提供了多个作用域修饰符,其中常用的有 public.private.protected.final.abstract.static.transient 和 volatile,这些修 ...

  3. charat越界返回什么_Java基本语法方法修饰符返回类型参数列表异常列表

    方法[method name] 定义 方法[method]是类的成员之一,(因为在java中,方法不能单独定义,它必须在类之中). 修饰符 返回类型 方法名()[throws 异常类型]{ //方法体 ...

  4. 【建议收藏】面试官贼喜欢问的 32+ vue 修饰符,你掌握几种啦?

    大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 参与,已进行了三个多月,大家一起交流学习,共同进步. 前言 vue简洁好用体现在很多个地方,比如其内置了32+修饰 ...

  5. 注意指针修饰符的准确含义

    首先从一起多线程无锁算法的事故说起,以下是一个无锁栈的实现测试,但在开-O2以上优化的情况下它却无法正常工作: #include "lf_stack.h" #include &qu ...

  6. Java访问控制修饰符详解

    在 Java 语言中提供了多个作用域修饰符,其中常用的有 public.private.protected.final.abstract.static.transient 和 volatile,这些修 ...

  7. bool可以是java得标识符嘛_Java-标识符--修饰符--关键字

    标识符 变量, 常量,函数,语句的名字,称为Java标识符. 标识符是用来给类.对象.方法.变量.接口和自定义数据类型命名的. Java语言中标识符取名规则: 1.由字母-数字-下划线和美元符号' $ ...

  8. Vue 32个修饰符,你不一定全知道!

    点击上方 前端开发博客,关注公众号 回复加群,加入前端群 前言 vue简洁好用体现在很多个地方,比如其内置了32+修饰符,可以很方便我们阻止冒泡.阻止默认事件.鼠标事件处理.系统键盘事件等等,让我们可 ...

  9. Java访问控制修饰符详解( public、 private、protected 和 friendly)

    在 Java 语言中提供了多个作用域修饰符,其中常用的有 public.private.protected.final.abstract.static.transient 和 volatile,这些修 ...

最新文章

  1. 团队-象棋游戏-开发文档
  2. 小议数据库主键选取策略
  3. 项目Alpha冲刺 Day11
  4. ALEIDoc EDI(4)--change point02
  5. Python 将两层列表展开平铺成一层
  6. ThinkPHP3.2 volist嵌套循环显示原理
  7. js 点击button切换颜色_ThingJS 和three.js开发示例对比,让开发早点下班回家!3D 可视化...
  8. mysql python 中文_python操作mysql中文显示乱码的解决方法
  9. 2018北大计算机复试线,2018年北京大学考研复试分数线已公布
  10. LeetCode-1.两数之和(哈希表)
  11. 9.2. FreeSWITCH
  12. 域还原的三种模式,以及应用场景
  13. 把mysql数据展示为图表_怎么从数据库中调出数据并生成动态图表?
  14. jsMind 使用直角画线
  15. 像智能手机一样造车,可能吗?
  16. SLIC 2.6:Windows Server 2022 OEM SLP 准备就绪,更新完毕
  17. 2021-11-25 使用kali自带的SET工具制作钓鱼网站
  18. 导航栏渐变方案收录一
  19. Java+PDFBox将PDF转成图片
  20. Block Recurrent Transformer:结合了LSTM和Transformer优点的强大模型

热门文章

  1. MySQL数据库查询中的特殊命令
  2. Logstash输出日志到elasticsearch
  3. javascript中new Date浏览器兼容性处理
  4. Spring Boot+Docker微服务分布式服务架构设计和部署案例
  5. UF_DRAW_set_view_display 使用问题
  6. checkio的日子(3)
  7. 为什么找不到Flash Builder 4.6 for Eclipse插件
  8. Lync Server 2010移动功能部署PART B:外部篇
  9. Web UI设计的关键要素!
  10. 计算机伦理问题案例分析,基于网络环境的案例教学在《计算机伦理学》中的实践研究...