volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。
用volatile关键字声明的变量i每一次被访问时,执行部件都会从i相应的内存单元中取出i的值。
没有用volatile关键字声明的变量i在被访问的时候可能直接从cpu的寄存器中取值(因为之前i被访问过,也就是说之前就从内存中取出i的值保存到某个寄存器中),之所以直接从寄存器中取值,而不去内存中取值,是因为编译器优化代码的结果(访问cpu寄存器比访问ram快的多)。
以上两种情况的区别在于被编译成汇编代码之后,两者是不一样的。之所以这样做是因为变量i可能会经常变化,保证对特殊地址的稳定访问。
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改
,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的
代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
使用该关键字的例子如下:
int volatile nVint;
当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即
使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
例如:
volatile int i=10;
int a = i;
...
//其他代码,并未明确告诉编译器,对i进行过操作
int b = i;
volatile 指出 i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编
译器生成的汇编代码会重新从i的地址读取数据放在b中。而优化做法是,由于编译器发现两次从
i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中。而不是重新
从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说vola
tile可以保证对特殊地址的稳定访问。
注意,在vc6中,一般调试模式没有进行代码优化,所以这个关键字的作用看不出来。下面
通过插入汇编代码,测试有无volatile关键字,对程序最终代码的影响:
首先,用classwizard建一个win32 console工程,插入一个voltest.cpp文件,输入下面的
代码:
#i nclude <stdio.h>
void main()
{
int i=10;
int a = i;
printf("i= %d\n",a);
//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道
__asm {
mov dword ptr [ebp-4], 20h
}
int b = i;
printf("i= %d\n",b);
}
然后,在调试版本模式运行程序,输出结果如下:
i = 10
i = 32
然后,在release版本模式运行程序,输出结果如下:
i = 10
i = 10
输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。
下面,我们把 i的声明加上volatile关键字,看看有什么变化:
#i nclude <stdio.h>
void main()
{
volatile int i=10;
int a = i;
printf("i= %d\n",a);
__asm {
mov dword ptr [ebp-4], 20h
}
int b = i;
printf("i= %d\n",b);
}
分别在调试版本和release版本运行程序,输出都是:
i = 10
i = 32
这说明这个关键字发挥了它的作用!
分享到:
相关推荐
volatile详解 一、volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的...
详解C中volatile关键字 volatile关键字是C语言中一个重要的关键字,它对变量的声明在不同编译环境下可能造成不同的结果。volatile关键字的作用是提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序...
C语言32个关键字详解 C语言是一种广泛应用于各种编程领域的编程语言,它具有强大的功能和灵活性,C语言的关键字是编程的基础组成部分,共有32个关键字。这些关键字可以分为四类:数据类型关键字、控制语句关键字、...
"学科重点-C语言32个关键字详解.zip"这个压缩包文件显然聚焦于C语言的基础知识,特别是其32个关键字的解释和应用。 C语言的关键字是预定义的保留字,它们具有特殊的含义,用于控制程序的结构和行为。以下是对这些...
### C语言中的关键字详解 #### 一、概述 C语言是一种广泛应用的编程语言,它具有高效性和灵活性。在C语言中,**关键字**是预定义的词汇,它们具有特殊的含义和功能,不能用作标识符(如变量名、函数名等)。C语言...
C语言中的32个关键字详解 C语言中有32个关键字,这些关键字是根据ANSI标准定义的,根据关键字的作用可以将其分为数据类型关键字、存储级别关键字、流程控制关键字三大类。 数据类型关键字 在C语言中,数据类型...
### C语言运算符详解 C语言是一门广泛应用于系统编程和嵌入式系统的高级编程语言。它提供了丰富的运算符和关键字来实现复杂的功能。本文将详细介绍C语言中的运算符及其特性,并简要提及C语言的一些关键概念。 ####...
### C语言32关键字分类详解 C语言是一种广泛使用的编程语言,在软件开发、操作系统编写以及嵌入式系统设计等领域有着重要的应用。为了更好地理解和掌握C语言的基础语法,本篇文章将详细介绍由ANSI标准定义的32个...
总结起来,`const`关键字在C语言中扮演了多个角色:声明常量、修饰指针和引用、控制函数行为、应用于类的成员函数以及与其他关键字如`volatile`结合使用。理解和熟练运用`const`,能够帮助编写更安全、更易于维护的...
#### `volatile`关键字详解 在C语言中,`volatile`是一个类型限定符,用于告知编译器不要对该变量进行优化,因为它可能在任何时候被未知的外部源更改。当一个变量被声明为`volatile`时,编译器会假设它的值可能在...
### C语言基础关键字详解 #### 一、引言 C语言是一种广泛应用于系统开发和嵌入式系统的高级编程语言。其简洁高效的特性使得它成为学习编程的基础语言之一。C语言的关键字是预定义的保留词,具有特定的意义,用于...
### C语言关键字详解 #### 1. auto:声明自动变量 - `auto` 关键字用来声明自动变量,这类变量通常存储在栈中,并且在它们的作用域之外是不可见的。 - 示例: ```c auto int i = 10; ``` #### 2. short:声明短...
### C语言关键字详解 C语言是一种广泛使用的高级编程语言,其功能强大且灵活。为了更好地理解和运用C语言,本文将详细介绍C语言中的关键字及其用途。 #### 1. 变量声明关键字 - **auto**: 用于声明自动变量,即...
### C语言32个关键字详解 C语言是一种广泛使用的编程语言,它提供了丰富的功能和强大的控制能力。在C语言中,关键字是具有特殊含义的预定义标识符,不能用作变量名或函数名等自定义标识符。下面将详细介绍C语言中的...
### C语言关键字详解 在C语言编程中,关键字是预定义的保留字,具有特定的含义和功能。本文将深入探讨C语言中的32个关键字,解析它们的用途与应用场景,帮助读者更全面地理解C语言的核心概念。 #### 1. `auto` `...
#### 二、C语言中的9种控制语句详解 1. **goto语句**:无条件转向指定标签的位置。 2. **if语句**:根据条件决定是否执行特定的代码块。 3. **while循环语句**:只要条件为真就会一直执行循环体内的代码。 4. **do-...
C语言32个关键字详解 C语言中有32个关键字,这些关键字是由C语言规定的具有特定意义的字符串,也称为保留字。用户定义的标识符不应与关键字相同。这些关键字可以分为以下几类: 一、类型说明符 类型说明符用于...
### C语言关键字详解 #### 一、概述 在C语言编程中,理解并熟练掌握关键字是基础也是核心技能之一。本文旨在深入解析C语言中的关键字、优先级以及ASCII码的相关概念,帮助读者更加全面地了解这些基础知识。 #### ...
### C语言关键字详解 #### 一、基本数据类型 C语言的基本数据类型是构成程序的基础,它们用于定义变量,每种类型都有特定的用途和内存占用情况。 - **`void`**:通常用来声明没有返回值的函数或者没有参数的函数...