详解volatile关键词的用法2

news/2024/7/3 1:58:31 标签: 编译器, 优化, cache

        volatile 影响编译器的结果输出,volatile 修饰的变量标明随时可能发生变化的(是指可能被本线程外的其他机制修改:如其他线程,中断,硬件),与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。
例如:
volatile int i=10;
int j = i;
...
int k = i;

        volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的内存地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。
优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据(上次已经读取到寄存器中,这次直接从寄存器中读取)放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。

       一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

      两个基本点:

一:告诉编译器不能做任何优化

二:表示用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用,同时改变的时候也需要写会内存。

  


http://www.niftyadmin.cn/n/1737781.html

相关文章

Alamofire-使用

所有类型请求,Alamofire都直接提供,通过Alamofire直接调用,配置相关参数即可。示例如下: 1、GET请求 let urlStr "http://onapp.yahibo.top/public/?sapi/test/list" Alamofire.request(url).responseJSON { (respo…

c语言关键字volatile的用法3

在学习C关键词的时候,我们看到了一个新面孔——volatile。在程序员面试宝典中提到“关键字volatile的面试例题是考查嵌入式编程”,中间有一段解析:   回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程…

Alamofire-安全策略

在web服务器和服务器通信的时候,使用https连接是非常重要的,能够对数据加密传输、身份认证。https协议需要到ca申请证书,部署到服务器,应用端连接都是对该链接受信任的。证书可申请也可以自签,自签证书需要客户端验证通…

POP-面向协议编程

什么是面向协议编程? 面向协议 协议 扩展 继承 通过协议、扩展做功能划分,降低模块间的耦合,增强代码的可扩展性。iOS中有一个不足之处就是多重继承,而协议正好能够解决多重继承的问题。在Swift中结构体变的更加强大了&#x…

Category-初探

参考:objc4-750源码编译 什么是Category? 分类是Objective-C 2.0之后新加的语言特性,一个特殊类,主要有一下作用: 在不改变原有类的前提下为已存在的类扩展新方法拆分类文件做功能分类,便于管理引用即用…

动态库注入

一、前言 二、注入思路 三、动态库注入实现 四、分析实现按钮监听 五、实战修改微信步数 一、前言 在文章《应用签名-脚本签名》中介绍了如何在真机上运行破壳应用(抖音、微信、支付宝等ipa包),来观察应用视图的层级结构,方法调…

fishhook-动态修改MachO文件

学习hook,不是要攻击别人,破坏别人的应用场景,而是为了更好的防护,让自己的应用更坚固更安全。 一、动态库注入回顾 在 《动态库注入》中使用了yololib对自定义动态库在WX应用中插入,既然能插入自定义库,我…

【转】浅谈编译器优化

“memory”比较特殊,可能是内嵌汇编中最难懂部分。为解释清楚它,先介绍一下编译器的优化知识,再看C关键字volatile。最后去看该描述符。 1、编译器优化介绍 内存访问速度远不及CPU处理速度,为提高机器整体性能&#xff0c…