首页 > 试题广场 >

下面有关volatile说法正确的有?

[不定项选择题]
下面有关volatile说法正确的有?
  • 当读取一个非volatile修饰的变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值
  • 优化器在用到volatile变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份
  • volatile适用于多线程应用中被几个任务共享的变量
  • 一个参数不可以既是const又是volatile
A选项跟题目问的volatile,好像关系不大啊。寄存器变量要声明称寄存器register
发表于 2016-11-05 16:10:11 回复(0)
Java 语言提供了一种稍弱的同步机制,即 volatile 变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新. 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的.
发表于 2015-09-16 15:59:02 回复(0)
http://blog.csdn.net/zerocboy/article/details/51638828
volatile:易变的,不稳定的。volatile用来声明那些可能在你的程序本身不知道的情况下会发生改变的变量。


一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
对于一般变量:为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中。以后再取变量值时,就直接从寄存器中取值。


一个参数既可以是const也可以是volatile:一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。(简单点就是该程序代码不能试图去修改它,但不排除硬件方面修改了它,我们每次都得重新读取它的值。)


几个应用例子:
a. 并行设备的硬件寄存器(如:状态寄存器)。
b. 一个中断服务子程序中会访问到的非自动变量。(个人理解:中断服务子程序不能用缓存在寄存器中的值来判断事件,因为那个值可能被修改了,需要重新读取。所以一般需要把这种变量声明为volatile。)
c. 多线程应用中被几个任务共享的变量。
发表于 2016-06-12 15:50:40 回复(0)
一个参数既可以是const还可以是volatile. 一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
发表于 2015-07-03 16:52:19 回复(2)
答案ABC
D为什是错的:
volatile 作用是避免编译器优化,说明它是随时会变的,它不是 non-const,和const不矛盾。被const修饰的变量只是在当前作用范围无法修改,但是可能被其它程序修改。所以 
const volatile int i = 0; 表示:
任何对i的直接修改都是错误的,但是i可能被意外情况修改掉,不要做无意义的优化。
发表于 2015-05-13 22:44:08 回复(2)
A不是有关volatile的叙述,按照题目坑的属性,不应该选吧。
发表于 2016-10-06 10:41:33 回复(0)
C怎么对的呢,volitile并不能保证多线程读写的正确性吧
发表于 2017-03-31 19:57:42 回复(1)
如果一个基本变量被volatile修饰,编译器将不会把它保存到寄存器中,而是每一次都去访问内存中实际保存该变量的位置上
发表于 2015-03-30 13:28:31 回复(0)
volatile关键字用于告诉编译器,一个变量的值可能在程序执行期间以不可预见的方式发生变化,编译器不应对该变量进行优化。即:编译器不能对这个变量进行优化,必须每次都从内存中读取它的值,而不能缓存到寄存器中。
发表于 2024-06-19 21:51:24 回复(0)
C 不对, 题目错了
发表于 2022-12-30 22:44:20 回复(0)
去你的,a虽然是对的,但根本不是描述的是volatile。。 volatile是用于强制要求从内存取值,防止一些编译器过度优化。
发表于 2019-11-05 17:15:33 回复(0)
A选项跟volatile有神马关系?
发表于 2019-06-10 16:37:00 回复(1)

我反对,A表述是对的,可是和volatile没有关系!!

发表于 2019-04-10 08:13:20 回复(0)

上次做这题答案是bcd怎么这次又是abc了 再说const和volitile能一起用的


发表于 2018-09-25 09:19:53 回复(0)

C明显也是错的,一个常见的误解

发表于 2018-07-30 09:14:53 回复(0)
const和volative可以同时使用
发表于 2018-05-14 11:24:58 回复(0)
标记
发表于 2018-03-12 10:55:03 回复(0)
C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据,而且读取的数据立刻被保存

一般说来,volatile用在如下的几个地方: 
1) 中断服务程序中修改的供其它程序检测的变量需要加volatile; 
2) 多任务环境下各任务间共享的标志应该加volatile; 
3) 存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
编辑于 2017-10-01 22:52:05 回复(0)
简单的理解是这样的,被const修饰的都变量,你可以理解为它是常量,会在编译的时候会类似于宏那样用值来替换变量名,而在const基础上同时加上vo...以后是易变的意思,在编译的时候不会去替换,而是用到它值的时候才回去读,由于是静态的,所以相当于是个可以用特殊方法改变的常量
发表于 2016-06-28 03:45:02 回复(0)