关键字volatile的含意
关键字volatile有什么含意并给出三个不同的例子。
答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)
3). 多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
1). 一个参数既可以是const还可以是volatile吗?解释为什么。
2). 一个指针可以是volatile 吗?解释为什么。
3). 下面的函数有什么错误:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
关键字volatile的含意相关推荐
- C语言面试题小练——第10天:宏定义一年的秒数、变量定义练习、关键字volatile有什么含意
文章目录 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) 2. 用变量a给出下面的定义 3. 关键字volatile有什么含意?并给出三个不同的例子. 1. 用 ...
- C语言基础 — 关键字volatile有什么含意? 三个不同的例子。
关键字volatile有什么含意? 并给出三个不同的例子. 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量 ...
- C++关键字Volatile的作用
2019独角兽企业重金招聘Python工程师标准>>> 和const对应,const表示变量是恒定不变的,而Volatile则相反,表示变量随时都可能被改变,因此每次获取变量都需要重 ...
- C语言:关键字volatile详解!
一.volatile 介绍 参看:volatile详解 参看:C Language Keywords Indicates that a variable can be changed by a bac ...
- C语言再学习 -- 关键字volatile
上周确实事情挺多的,年会.公司聚餐,一到过年就有忙不完的事分心.还好C语言再学习总结的已经差不多了,年前也不展开别的了,接下来这十几天.总结几篇典型的面试题吧. 言归正传,接下来看看关键字 volat ...
- 每日一题(17)—— 关键字volatile的作用和三个不同的应用场合
关键字volatile的作用和三个不同的应用场合 作用:防止编译器优化: (1)并行设备的硬件寄存器(如状态寄存器):// #define S5PV210_GPIO_DATA (*(volatile ...
- C语言中的关键字“ volatile”的用法(摘)
C语言中的关键字" volatile"的用法(摘) volatile 这个ANSI C 关键字在经典的C 教程中很少提及,高层编程的人也可能永远都 不会用到,但是作为嵌入式开发者来 ...
- 关键字volatile有什么含意 并给出三个不同的例子
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存 ...
- 关键字volatile有什么含意?并给出三个不同的例子
一个定义为volatile的变量就是说它可能会意想不到的改变(改变它的情况有很多,例如操作系统,硬件,线程),这样,编译器就不会去假设这个值,也就是说,当优化器读到这个值时就会小心翼翼的去重新读取这个 ...
最新文章
- Thrift源码解析--TBinaryProtocol
- 谷歌称居家办公影响工作效率!2021 年将回归线下办公
- boot定时任务开启和关闭 spring_Spring之定时任务实践
- 【转载】一天之内上手.Net+WAP项目
- Spring学习总结(19)——Spring概念详解
- Delphi通过ADOQuery控件实现Sqlserver数据库多结果集的数据打印
- html中h标签可包含a标签,HTML中H标签P标签(Paragraph)img标签(image)a标签(anchor)
- 线程的故事:3 位“母亲”成就了优秀的我!
- CSDN Chrome插件更新:用CSDN的方式让开发再快一点
- 前端基础学习之Html标签
- XAF 应用程序模型架构
- 第四季-专题14-串口驱动程序设计
- 【信号与系统|吴大正】3:离散系统的时域分析
- CSS Sprite、CSS雪碧图应用实例
- SAS: PROC IMPORT简单入门介绍
- 【老生谈算法】matlab实现方位角计算源码——方位角计算
- pancakeswap 开盘抢跑机器人 (附代码)
- NVIDIA TX2---Tegra架构介绍
- 解读机械图样——局部视图
- h5 数字变化_那些H5用到的技术(6)——数字滚动特效
热门文章
- 10、《每周一点canvas动画》——移动物体(2)
- 仓库处理中 无法修改_Shopee SLS仓库异常件退货流程
- STM32 AD7685 AD7684 AD7686 AD7687 AD7683 AD7680系列调试记录
- 【SpringBoot】61、SpringBoot中使用谷歌身份验证器(Google Authenticator)实现二步身份验证
- 仙道录 第一卷 天道门 第二章 桃花镇
- DNS域名解析(理论+正项解析)
- Java版spring cloud 企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
- 在winfrom窗体中使用漂亮的窗体样式。
- 社会生活-社会生活十大著名法则:社会生活十大著名法则
- 适配全面屏方法(无效)