面试点:解读关键字volatile(C语言面试题分析之一)
文章推薦指數: 80 %
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。
遇到这个关键字声明的变量,编译器对访问 ...
开发者社区>
littletigerbj>
正文
面试点:解读关键字volatile(C语言面试题分析之一)
2011-05-23
961
简介:
面试点:解读关键字volatile
C语言面试题分析之一
一.volatile是什么?
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。
+关注继续查看
面试点:解读关键字volatile
C语言面试题分析之一
一.volatile是什么?
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。
遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
二.编译器优化是什么意思?
inti=5;
inta=i;
……
intb=i;
编译器发现两次从i读数据的代码之间,并没有对i进行过操作,它会自动把上次读的数据放在b中,而不是重新从i里面读;
三.哪些情况,改变了内存中变量的值,编译器不知道?
1.多线程应用中被几个任务共享的变量;
2.一个中断服务子程序中会访问到的非自动变量;
3.并行设备的硬件寄存器(如:状态寄存器);
四.何时需要使用volatile这个关键字?
嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用会经常要求定义为volatile类型的变量。
五.使用volatile带来什么好处?
volatileintnCount;
当要求使用volatile声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。
而且读取的数据立刻被保存。
六.3个经典的volatile问题
1).一个参数既可以是const还可以是volatile吗?解释为什么。
2).一个指针可以是volatile吗?解释为什么。
3).下面的函数有什么错误:intsquare(volatileint*ptr){return*ptr**ptr;}下面是答案:1).可以是。
例如对于只读的状态寄存器而言,如果它仅仅是volatile类型,那么它还是可能被意想不到的改变。
但它还是const的时候,程序就不应该试图去修改它2).可以是的。
尽管这种情况并不常见,但它还是可以。
一个例子就是:
当一个中断服务子程序企图去修改一个指向一个buffer指针的时候。
3).这段代码可能有点恶作剧的味道。
但它很好说明volatile类型参数的含义和作用。
这段代码的目的是用来返指针*ptr所指向的值的平方,
但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:intsquare(volatileint*ptr){inta,b;a=*ptr;b=*ptr;returna*b;}由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。
结果,这段代码可能返不是你所期望的平方值!正确的代码如下:longsquare(volatileint*ptr){inta;a=*ptr;returna*a;}
七.总结
1.使用volatile关键字修饰的变量,可以避免编译器优化;
2.使用volatile关键字修饰的变量,每次都是重新读取内存中的值,而不是使用保存在寄存器里的值了;
3.编译器优化的做法是:
inti=5;
inta=i;
……
intb=i;
编译器发现两次从i读数据的代码之间,并没有对i进行过操作,它会自动把上次读的数据放在b中,而不是重新从i里面读。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。
具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。
如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
程序员
C语言
编译器
BI
人工智能
c语言关键字volatile
c语言关键字volatile作用
单例模式volatile关键字
c语言关键字vol
关键字volatile分析
开发者社区>
开发与运维
>
文章
作者高分内容
更多
2018跟着小虎玩着去软考--《小虎新视角历年信息系统项目管理师试题讲解(2014-2017)》书中小诗
1221
湖北松滋历史上七大王氏望族
2930
截止2017年5月19日小虎软考粉丝有798人
1132
软考高级证书可以积分50分
1273
2018跟着小虎玩着去软考--信息系统项目管理师小虎视频讲解----考友评论
1402
相关文章
游客n4jcsdeetmtbg
volatile关键字详解(上)
本文主要是讲解volatile关键字的使用,首概括它的三大特征,然后引入JMM模型,结尾我们解释了单例模式(懒汉模式)中为什么要用volatile。
22
0
shy丶gril
C/C++中的static关键字的总结
1297
0
杰克.陈
C#defualt关键字默认值用法
原文:C#defualt关键字默认值用法
默认值表达式生成类型的默认值。
默认值表达式在泛型类和泛型方法中非常有用。
使用泛型类和泛型方法时出现的一个问题是,如何在无法提前知道以下内容的情况下将默认值赋值给参数化类型 T:
T 是引用类型还是值类型。
804
0
异步社区
《C语言编程初学者指南》一1.4 理解关键字
本节书摘来自华章出版社《C语言编程初学者指南》一书中的第1章,第1.4节,作者【美】KeithDavenport(达文波特),M1ichaelVine(维恩),更多章节内容可以访问云栖社区“异步社区”公众号查看
1.4 理解关键字
在标准ANSIC编程语言中,有32个单词定义为关键字(keyword)。
1294
0
eddie小英俊
C语言文件操作解析(二)
940
0
范大脚脚
【译】使用C#yield关键字来提高性能和可读性
1073
0
eddie小英俊
C语言文件操作解析(一)
689
0
王小雷
SAS进阶《深入解析SAS》之开发多语言支持的SAS程序
SAS进阶《深入解析SAS》之开发多语言支持的SAS程序
1.多语言支持的应用程序是指该程序在世界给第使用时,其能够处理的数据,以及处理数据的方式、信息展现的方式都符合当地的语言、文化习惯,这要求应用程序运行时,能够自动进行与地区、语言相关的处理,也就是通常所说的国际化。
2.SBCS、DBCS、MBCS
单字节字符集SBCS指在该字符集中的字符最多由2个字
1796
0
坎布里奇
Volatile关键字
多线程同步volatile关键字java虚拟机阅读
787
0
韩曙亮
【Java并发编程】线程共享变量可见性(volatile关键字使用场景分析|MESI缓存一致性协议|总线嗅探机制)
【Java并发编程】线程共享变量可见性(volatile关键字使用场景分析|MESI缓存一致性协议|总线嗅探机制)
55
0
+关注
littletigerbj
小虎,曾先后获得信息系统项目管理师(2009)、系统分析师(2011)和系统架构师(2012)资格证书,软考高级资格实战派辅导老师,致力于研究和传播软考新视角、新思维方法。
472
文章
0
问答
作者高分内容
更多
2018跟着小虎玩着去软考--《小虎新视角历年信息系统项目管理师试题讲解(2014-2017)》书中小诗
1221
湖北松滋历史上七大王氏望族
2930
截止2017年5月19日小虎软考粉丝有798人
1132
软考高级证书可以积分50分
1273
2018跟着小虎玩着去软考--信息系统项目管理师小虎视频讲解----考友评论
1402
文章排行榜
最热
最新
1
函数计算HTTP触发器支持异步,解放双手搭建Web服务
24433
2
从这些云原生企业身上,我看到了数字化创新者该有的样子
22686
3
阿里巴巴云数据仓库MaxCompute数据安全最佳实践
9475
4
OpenYurt开源之夏开始申请啦
15822
5
云开发两周年庆—游戏畅玩领好礼
15713
6
【转载】基于MaxCompute的大数据安全方案
13242
7
数据仓库的分层架构与演进
11955
8
【转载】大数据在线离线一体化解决方案最佳实践
12321
9
万字长文带你玩转阿里云ECS云服务器(涵盖ECS产品购买、ECS管理、ECS快速部署云盘服务、ECS快照原理)
83636
10
[版本更新]PolarDB-XonOSS提供冷热数据分离存储
5071
11
不破不立!Fastjson2.0性能炸裂,为了下一个十年
6319
12
开源之夏2022重磅来袭!欢迎报名阿里云PolarDB社区项目!
4885
13
大厂技术实现|图像检索及其在淘宝的应用@计算机视觉系列
5596
14
每周问答精选:PolarDB-X完全兼容MySQL吗?
4624
15
简历面试|不会讲故事的人到底有多吃亏
80721
16
PolarDB-X与X-DB、PolarDB
4512
17
开发者玩转机器学习不能错过的15篇深度文章!
3568
18
阿里云视频云互动虚拟技术,打造虚拟直播最佳沉浸式体验
3434
19
AliIAC智能音频编解码器:在有限带宽条件下带来更高质量的音频通话体验
2355
20
为天猫精灵开发一个日程小秘书
19532
1
复旦-阿里电子信息专业学位研究生专业实践基地合作对接会成功举行
81
2
Docker安装redis
100
3
快手实时数仓保障体系研发实践
205
4
PythonHttpServer实现服务监听和地址回调
8323
5
使用实践:Hologres锁介绍以及排查锁
91
6
一文详解|增长那些事儿
72
7
直播预告|PostgreSQL内核解读系列第一讲:PostgreSQL系统概述
76
8
Maxcompute-UNION数据类型对齐的方法
72
9
首次曝光!唯一全域最高等级背后的阿里云云原生安全全景图
63
10
模拟IDCspark读写MaxCompute实践
73
11
不止于观测|阿里云可观测套件正式发布
58
12
一日一技:使用Python翻译HTML中的文本字符串
69
13
GitHub正式上线CopilotAI编程工具:每月收费10美元,学生免费
62
14
1分钟Serverless搭建你的首个个人网站(完成就送猫超卡)
237
15
一文搞懂Vue3中slot插槽的使用!
92
16
一日一技:在Python里面实现链式调用
73
17
“智物智造”杯2022物联网创新应用大赛,你的idea改变世界!
312
18
新手必会的静态站点生成器——Gridsome
150
19
高能直播,大咖云集!邀你共启BizDevOps探索之路。
92
20
云端极简部署Svelte3聊天室
55
推荐文章
最新的产品福利,顶级大咖观点,尽在《开发者评测局》
大咖圆桌会:产学研共话BizDevOps。
开发技能PK竞技大赛第三期
乘风者计划邀您入驻社区,精彩权益即刻享
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载
延伸文章資訊
- 1面试官最爱的volatile 关键字,这些问题你都搞懂了没?
volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。 传递性:如果(A)happens-before(B),且(B)hap...
- 2面試C/C++ 觀念整理
這裡有些題目是來自網路上MTK面試的C考古題,另外又加入了一些易搞混的觀念 ... 一個定義為volatile 的變量是說這變量可能會被意想不到地改變(尤其在 ...
- 3嵌入式的面試題 - 立你斯學習記錄
在定義常量時,為什麼推薦使用const,而不是#define。 20、C語言的volatile的含義是什麼。使用時會對編譯器 ...
- 4C語言中volatile關鍵字詳解以及常見的面試問題 - tw511教學網
C語言中volatile關鍵字的作用. volatile int a; main() { a=0; b = a; printf("b = %d\n", b); }. volatile的意思是「多...
- 5C++常见面试题(11)——volatile_哎呦 - CSDN博客
本文主要介绍在C/C++语言中,volatile关键字的相关内容。1 概述1.1 why volatilevolatile 关键词,最早出现于19世纪70年代, ...