一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份.下面是volatile变量的几个例子:
1).并行设备的硬件寄存器(如:状态寄存器)
2).一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
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;
}
volatiel关键字
时间: 2024-12-16 11:44:57
volatiel关键字的相关文章
JAVA synchronized关键字锁机制(中)
synchronized 锁机制简单的用法,高效的执行效率使成为解决线程安全的首选. 下面总结其特性以及使用技巧,加深对其理解. 特性: 1. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 2. 当一个线程同时访问object的一个synchronized(this)同步代码块时,其它线程仍然可以访问非修饰的方法或代码块. 3. 当多个线程同时访问object的synchronized(this)同步代码
Java 中几个重要的关键字
Java中的关键字特别多,大致如下: 访问控制 private protected public 类,方法和变量修饰符 abstract class extends final implements interface native new static strictfp synchronized transient volatile 程序控制 break continue return do while if else for instanceof switch case default 异常
RobotFramework自动化测试框架的基础关键字(五)
1.1.1 Run Keyword If判断的使用 Run Keyword If是一个常用的用来做逻辑判断的关键字,意思是如果满足了某一个判断条件,然后就会执行关键字,我们对list3中放入0,1,2三个元素,然后遍历list3,判断当取到元素为0时,我们输出"男生". @{list3} Create List 0 1 2 :FOR ${value} in @{list3} Run Keyword If '${va
this关键字的使用
* this关键字的使用: * 1.this:可以理解为:当前对象 或 当前正在创建的对象 * * 2.this可以用来调用:属性.方法.构造器 * * 3.this调用属性.方法 * 在方法中:我们可以在方法中通过"this.属性"或者"this.方法"的方法,表示调用当前对象的指定属性或方法.但是通常 * 情况下,我们都省略了"this.".但是如果方法的形参和当前对象的属性名相同的情况下,我们必须显式的使用"this.变量&quo
关键字和继承
1.关键字的使用 2.继承
【转】C++中的explicit关键字
在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上.再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决.但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的.了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用.既然C++语言提供这种特性,我想在有些时候这种特性将会非常有用. 按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举
就是要你懂Java中volatile关键字实现原理
原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用. 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好.更正确地地
abstract关键字
abstract关键字 一,abstract关键字: abstract关键字表示的是抽象的意思,可以用来修饰类和方法.修饰的类我们称之为抽象类,修饰的方法我们称为抽象方法 二.abstract修饰类,抽象类: public abstract class 类名{} 抽象类用来表示一些抽象的概念 抽象类的特点: a.抽象类不能被实例化 b.抽象类中可以有属性,方法,构造方法,都是用来给子类继承 c.抽象类中的方法不一定全部都是抽象方法 三.abstract修饰方法,抽象方法(不需要实现,由子类来实现
this关键字
this关键字 一:this的关键字的用法: 1.调用属性: this.health=100; this.name="小黄"; 2.调用方法: this.print(); 3.调用构造方法 this();--->如果是使用,必须是构造方法中的第一条语句 this("小黑",100,100,"雄"); 二:this关键字的使用方法: 1.调用本类的属性this.属性名: a.可以在构造方法中调用的属性进行赋值 b.可以在本类的方法中调用对象的