当前位置: 首页 > news >正文

吉林省示范校建设专题网站/2023疫情最新情况

吉林省示范校建设专题网站,2023疫情最新情况,排版设计素材,珠海网站引子1 猜猜看,下面这段代码有什么问题: void Delay(UINT32 n){while(—n);}答案: 本来代码完全正常,但是为了优化性能,打开了编译器的优化。但是发现这个函数被编译器优化掉了。为了防止被优化掉,需要给函数…

引子1

猜猜看,下面这段代码有什么问题:

void Delay(UINT32 n){while(—n);}

 答案:

 本来代码完全正常,但是为了优化性能,打开了编译器的优化。但是发现这个函数被编译器优化掉了。为了防止被优化掉,需要给函数的参数加上volatile:

void Delay(volatile UINT32 n){while(—n);}

 

引子2

再猜猜看,《程序员面试宝典》这段代码有什么问题:

int square(volatile int *ptr) { return *ptr * *ptr; }

 答案:

由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

int square(volatile int *ptr)  { int a,b; a = *ptr; b = *ptr; return a * b; }

 由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

int square(volatile int *ptr)  { int a; a = *ptr; return a * a; }

 

正文

1. 为什么用volatile?

C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量(易变的),通常用于建立语言级别的 memory barrier。

volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。

遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

声明时语法:int volatile vInt;

当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存

 

由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

volatile的本意是“易变的”,不过翻译成“直接存取原始内存地址”更为合适。“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化。

 

使用该关键字的例子如下: 

int volatile nVint;//当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

 

对于这样的代码:

volatile int i = 10; int a = i;... //其他代码,并未明确告诉编译器,对i进行过操作int b = i;

volatile 指出 i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在b中。

而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问。

 

 一般说来,volatile用在如下的几个地方:

  1. 中断服务程序中修改的供其它程序检测的变量需要加volatile;
  2. 多任务环境下各任务间共享的标志应该加volatile;
  3. 存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义。

另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。

 

2.volatile 指针

    和 const 修饰词类似,const 有常量指针和指针常量的说法,volatile 也有相应的概念:

 

  • 修饰由指针指向的对象、数据是 const 或 volatile 的:

     const char* cpch;

          volatile char* vpch;

 

  • 指针自身的值——一个代表地址的整数变量,是 const 或 volatile 的:

          char* const pchc;

     char* volatile pchv;

 

注意:(1) 可以把一个非volatile int赋给volatile int,但是不能把非volatile对象赋给一个volatile对象。

     (2) 除了基本类型外,对用户定义类型也可以用volatile类型进行修饰。

         (3) C++中一个有volatile标识符的类只能访问它接口的子集,一个由类的实现者控制的子集。用户只能用const_cast来获得对类型接口的完全访问。此外,volatile向const一样会从类传递到它的成员。

 

 

 

转自:http://www.cnblogs.com/Chase/archive/2010/07/05/1771700.html

转载于:https://www.cnblogs.com/Allen-rg/p/7001672.html

http://www.lbrq.cn/news/731917.html

相关文章:

  • 温州市建筑业联合会/兰州网络推广优化怎样
  • 新年祝福语在线制作网站/百度seo搜索排名
  • 社交网站开发意义/建立一个网站需要多少钱
  • c语言做网站后台服务/什么优化
  • 专业做网站建设公司有哪些/长沙百度搜索排名优化
  • 在柬埔寨做网站彩票推广/网页优化方案
  • 建筑装修装饰工程内容/产品seo优化
  • 电子商务网站开发方案/百度推广托管公司
  • 做网站标题代码/百度投放平台
  • 织梦做的网站后台/可以引流推广的app
  • 专业做公司宣传网站的/营销云
  • 广州市红十字会医院网站建设项目/成人职业培训机构
  • 做网站的你选题的缘由是什么/公司网络搭建
  • 龙口网站建设/百度世界500强排名
  • 孝感个人网站建设/全球搜
  • 苏州市建设中心网站首页/宁波seo入门教程
  • 微信如何添加小程序/seo推广费用需要多少
  • 广东网站备案查询/百度招商加盟推广
  • 网站服务器和网站备案/网页优化公司
  • 黑色炫酷灯饰照明科技企业商务网站模板/百度站长工具域名查询
  • 西安市高新区建设局网站/如何制作微信小程序
  • 某企业网站建设规划书/昆明网站seo优化
  • 做网站备案的问题/信息流优化师怎么入行
  • 凡客诚品售后/郑州官网网站优化公司
  • 重庆网站推广营销/网站开发框架
  • 优秀个人网站推荐/营销推广是什么意思
  • 可以做营销任务的网站/阿里数据
  • 个人备案转企业网站期间/武汉seo首页优化报价
  • 专业彩票网站开发/西安百度公司官网
  • 哪里有网站制作平台/seo如何优化关键词
  • ZYNQ启动流程——ZYNQ学习笔记11
  • 设计模式:抽象工厂模式
  • vue-admin-template权限管理
  • 【力扣 Hot100】滑动窗口巧解字串问题
  • 计算机视觉第一课opencv(三)保姆级教学
  • 意象驱动的深层语义:感知认知统一对自然语言处理与知识图谱的影响