首页 > 试题广场 >

关于C语言中volatile关键字,下面的说法哪一个是错误的

[单选题]
关于C语言中volatile关键字,下面的说法哪一个是错误的?
  • 编译器会禁止对volatile修饰的变量进行读写优化
  • 用volatile修饰的变量,读取速度会更快
  • 每一次读取volatile修饰的变量都会从内存中读取
volatile提醒编译器它后面所定义的变量随时都有可能改变 ,因此编译后的程序每次需要存储或读取这个变量的时候 ,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储, 可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
发表于 2016-12-19 20:05:09 回复(2)
B

1> 告诉compiler 不能做任何优化
2> 用volatile 定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在***或寄存器中的备份。

http://blog.csdn.net/tigerjibo/article/details/7427366
发表于 2017-02-14 17:12:59 回复(2)
使用volatile关键字声明的变量,系统总是重新从它所在的内存中读取数据,即使它前面的指令刚刚从该处读取过数据,而且读取的数据立刻被保存;相反,若没有使用volatile,编译器可能会做优化处理,可能暂时使用寄存器中的值,而如果该变量由别的程序更新了的话,将会出现不一致的现象!!
总结起来就是:
1. 编译器会禁止对 volatile 修饰的变量做读写优化,A 正确;
2. 每次使用该变量时,系统都会重新从它所在内存中读取数据,C 正确;
3. 这相对于做了读取优化的变量来说,速度当然是慢了一些啦, B 错误。
发表于 2017-06-30 10:26:30 回复(0)
如果不适用volatile关键字的话,编译器会进行假定的优化(变量不会被改变),即发现程序中使用两次该变量,但是并未改变变量的值,于是编译器把该变量临时存储在寄存器中,下次即直接从寄存器中读取变量的值;
但是对于那些变量可能会被修改的情况,必须使用volatile关键字提醒编译器,不要进行假定的优化,即每次读取值都从内存中读取最为准确。
变量被修改是指:***(而不是变量所在的程序)可能会改变该变量的值,这就需要使用volatile限定符。就是有些变量是一些共享性质的数据,可能被用于硬件地址及在其他程序或同事运行的线程中。
发表于 2019-01-28 18:18:57 回复(0)
1.volatile修饰的变量会随时变化,比如IO口的数据,因此通知编译器不要优化读取,每次都从内存中获取最新值
发表于 2020-06-25 10:06:14 回复(0)
volatile 的作用 是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。 常见的几个面试题: 1、一个参数既可以是const还可以是volatile吗? 可以,例如只读的状态寄存器。它是 volatile 因为它可能被意想不到地改变。它是 const 因为 程序不应该试图去修改它。 2、一个指针可以是 volatile 吗? 可以,当一个中服务子程序修改一个指向一个 buffer 的指针时。 总结: volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如 果没有 volatile 关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。所以遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
发表于 2023-09-20 10:43:03 回复(0)
当对象的值可能在程序的控制或检测之外被改变时,应该将该对象声明为volatile。关键字volatile告诉编译器不应对这样的对象进行优化。每次都从内存读取。
其用法和const相似,起到对类型额外修饰的作用。
只有当某个引用(或指针)是volatile的时,我们才能使用一个volatile对象初始化该引用(地址传给指针)。
发表于 2019-11-22 20:06:20 回复(0)
volatile要求编译器不进行优化,使变量每次读取,都必须严格按地址读取数据
volatile 修饰的变量可以赋值给普通变量,但是不能反过来
volatile 可以修饰基本类型和自定义类型
发表于 2018-08-10 17:07:28 回复(0)
volatile翻译:不稳定的,易变的;(因为易变,所以每次都要到内存读取)
发表于 2018-04-11 14:12:51 回复(0)
volatile提醒编译器它 后面所定义的变量随时都有可能改变  ,因此 编译后的程序每次需要存储或读取这个变量的时候  ,都会直接从变量地址中读取数据。 如果没有volatile关键字,则编译器可能优化读取和存储,  可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
发表于 2017-06-06 21:32:17 回复(0)