C 回顾 volatile 和 register 修饰符
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 修饰符相关推荐
- 开课吧Java课堂:Transient和volatile修饰符如何运用
Java定义了两类有趣的修饰符:transient和volatile,这些修饰符用来处理特殊的情况.如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: class T { ...
- 1.15 Java访问控制修饰符(public、 private、protected 和 friendly)
在 Java 语言中提供了多个作用域修饰符,其中常用的有 public.private.protected.final.abstract.static.transient 和 volatile,这些修 ...
- charat越界返回什么_Java基本语法方法修饰符返回类型参数列表异常列表
方法[method name] 定义 方法[method]是类的成员之一,(因为在java中,方法不能单独定义,它必须在类之中). 修饰符 返回类型 方法名()[throws 异常类型]{ //方法体 ...
- 【建议收藏】面试官贼喜欢问的 32+ vue 修饰符,你掌握几种啦?
大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 参与,已进行了三个多月,大家一起交流学习,共同进步. 前言 vue简洁好用体现在很多个地方,比如其内置了32+修饰 ...
- 注意指针修饰符的准确含义
首先从一起多线程无锁算法的事故说起,以下是一个无锁栈的实现测试,但在开-O2以上优化的情况下它却无法正常工作: #include "lf_stack.h" #include &qu ...
- Java访问控制修饰符详解
在 Java 语言中提供了多个作用域修饰符,其中常用的有 public.private.protected.final.abstract.static.transient 和 volatile,这些修 ...
- bool可以是java得标识符嘛_Java-标识符--修饰符--关键字
标识符 变量, 常量,函数,语句的名字,称为Java标识符. 标识符是用来给类.对象.方法.变量.接口和自定义数据类型命名的. Java语言中标识符取名规则: 1.由字母-数字-下划线和美元符号' $ ...
- Vue 32个修饰符,你不一定全知道!
点击上方 前端开发博客,关注公众号 回复加群,加入前端群 前言 vue简洁好用体现在很多个地方,比如其内置了32+修饰符,可以很方便我们阻止冒泡.阻止默认事件.鼠标事件处理.系统键盘事件等等,让我们可 ...
- Java访问控制修饰符详解( public、 private、protected 和 friendly)
在 Java 语言中提供了多个作用域修饰符,其中常用的有 public.private.protected.final.abstract.static.transient 和 volatile,这些修 ...
最新文章
- 团队-象棋游戏-开发文档
- 小议数据库主键选取策略
- 项目Alpha冲刺 Day11
- ALEIDoc EDI(4)--change point02
- Python 将两层列表展开平铺成一层
- ThinkPHP3.2 volist嵌套循环显示原理
- js 点击button切换颜色_ThingJS 和three.js开发示例对比,让开发早点下班回家!3D 可视化...
- mysql python 中文_python操作mysql中文显示乱码的解决方法
- 2018北大计算机复试线,2018年北京大学考研复试分数线已公布
- LeetCode-1.两数之和(哈希表)
- 9.2. FreeSWITCH
- 域还原的三种模式,以及应用场景
- 把mysql数据展示为图表_怎么从数据库中调出数据并生成动态图表?
- jsMind 使用直角画线
- 像智能手机一样造车,可能吗?
- SLIC 2.6:Windows Server 2022 OEM SLP 准备就绪,更新完毕
- 2021-11-25 使用kali自带的SET工具制作钓鱼网站
- 导航栏渐变方案收录一
- Java+PDFBox将PDF转成图片
- Block Recurrent Transformer:结合了LSTM和Transformer优点的强大模型
热门文章
- MySQL数据库查询中的特殊命令
- Logstash输出日志到elasticsearch
- javascript中new Date浏览器兼容性处理
- Spring Boot+Docker微服务分布式服务架构设计和部署案例
- UF_DRAW_set_view_display 使用问题
- checkio的日子(3)
- 为什么找不到Flash Builder 4.6 for Eclipse插件
- Lync Server 2010移动功能部署PART B:外部篇
- Web UI设计的关键要素!
- 计算机伦理问题案例分析,基于网络环境的案例教学在《计算机伦理学》中的实践研究...