`

Keyword volatile in C Programming Language

阅读更多

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文件,输入下面的

代码: 

#include <stdio.h>
void main() 
{ 
        int i=10; 
        int a = i; 

        printf(&quot;i= %d\n&quot;,a); 
         //下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道 
        __asm { 
                mov dword ptr [ebp-4], 20h 
        } 

        int b = i; 
        printf(&quot;i= %d\n&quot;,b); 
}    
   

 

然后,在调试版本模式运行程序,输出结果如下:
i = 10
i = 32
然后,在release版本模式运行程序,输出结果如下:
i = 10
i = 10
输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。

下面,我们把 i的声明加上volatile关键字,看看有什么变化:

#include <stdio.h>
void main() 
{ 
        volatile int i=10; 
        int a = i; 

        printf(&quot;i= %d\n&quot;,a); 
         __asm { 
                 mov dword ptr [ebp-4], 20h 
        } 

        int b = i; 
        printf(&quot;i= %d\n&quot;,b); 
}      

 

分别在调试版本和release版本运行程序,输出都是:
i = 10
i = 32
这说明这个关键字发挥了它的作用!




Quote

 

分享到:
评论

相关推荐

    C语言中关于关键字volatile的用法

    在C语言中,关键字volatile是一个非常重要的修饰符,它在程序设计中起着不可替代的作用。volatile的主要目的是告诉编译器,它所修饰的变量是易变的,可能会在程序的控制之外被改变。因此,编译器在优化代码时,不能...

    mcu-volatile-example.rar_volatile_单片机C语言

    在单片机编程中,`volatile` 是一个非常重要的关键字,尤其在使用 C 语言时。这个关键字在处理硬件交互、中断服务程序以及多线程环境中的变量时扮演着关键角色。`volatile` 关键字的主要目的是告诉编译器,某个变量...

    The C++ Programming Language

    C++是在C语言的基础上发展而来的,它保留了C语言的所有特性,并在此基础上增加了面向对象的特性,如类、对象、继承、多态等,同时引入了模板、异常处理、命名空间等高级特性。C++广泛应用于系统软件、游戏开发、高...

    APT32F003触摸按键32位MCU,引脚兼容STM8S003,大存储器2KB RAM,36KB Flash-AN1501 Volatile Keyword In C Code.pdf

    APT32F003触摸按键32位MCU,引脚兼容STM8S003,大存储器2KB RAM,36KB Flash-AN1501 Volatile Keyword In C Code.pdf

    单片机C语言中volatile的作用

    ### 单片机C语言中volatile的作用 在探讨单片机C语言中`volatile`关键字的作用之前,我们首先需要理解`volatile`的基本概念及其应用场景。`volatile`是一个用于声明变量的关键字,在C语言中,使用`volatile`修饰的...

    C中volatile_const解析

    ### C中`volatile`与`const`解析 #### 概述 在C语言中,`volatile`和`const`是两个非常重要的关键字,它们在不同的场景下有着独特的用途。掌握这两个关键字不仅能够帮助开发者写出更加高效和可靠的代码,还能够在...

    volatile用法

    `volatile`关键字在C语言中是一个非常重要的概念,主要用于处理多线程环境或者与硬件交互时的内存可见性问题。它的主要作用是确保对变量的修改能够立即反映到所有线程,防止编译器进行不必要的优化,使得其他线程...

    volatile详解

    ### volatile详解 #### 一、volatile的基本概念与作用 `volatile`关键字在编程语言中扮演着重要的角色,尤其是在处理并发编程、嵌入式系统开发等领域。`volatile`的中文含义通常被翻译为“易变的”,但根据描述中...

    volatile 变量的说明

    volatile变量在编程语言中,尤其是Java和C/C++中,是一种特殊的标识符,用于指示编译器该变量的值可能在编译器不知情的情况下发生变化。这个关键字的主要作用是告诉编译器不要对这个变量进行优化,每次使用时都需要...

    C语言中volatile的用法

    ### C语言中`volatile`关键字的深度解析及应用 在C语言编程中,`volatile`关键字扮演着一个特殊的角色,主要用于指示编译器对于特定变量的处理方式,尤其是在那些涉及硬件交互、中断处理以及多线程环境下的场景中。...

    Volatile详解,深入学习Volatile

    Volatile是C/C++编程语言中的一个关键字,它与const一起被称为"cv特性",用于指示变量的值可能被系统或其他线程/进程改变,从而强制编译器每次从内存中读取该变量的最新值。在多线程或嵌入式编程中,volatile的作用...

    volatile的用法

    Volatile是C语言中的一个类型修饰符,用于告诉编译器该变量可能会在程序的控制之外被改变,从而禁止编译器对涉及该变量的代码做优化处理。这种用法在多线程、中断服务程序和硬件访问等场合特别重要。接下来详细说明...

    详解C中volatile关键字

    volatile关键字是C语言中一个重要的关键字,它对变量的声明在不同编译环境下可能造成不同的结果。volatile关键字的作用是提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个...

    volatile的用法讲解

    "volatile的用法讲解" volatile是一种特殊的变量修饰符,它告诉编译器,这个变量的值可能会被意外地改变,因此编译器不能对其进行优化,以确保每次读取该变量时都能获取最新的值。下面是volatile变量的使用场景: ...

    volatile的使用方法

    volatile 关键字在 C 语言中的使用方法 在 C 语言中,volatile 关键字是用来指定变量的存储类别的,它告诉编译器这个变量的值可能会在编译器不知道的情况下被修改,因此需要重新加载这个变量的值。volatile 关键字...

    stm32 volatile变量的正确使用

    在C语言中,`volatile`是一个类型限定符,用于告知编译器不要对该变量进行优化,因为它可能在任何时候被未知的外部源更改。当一个变量被声明为`volatile`时,编译器会假设它的值可能在任意时间发生变化,因此每次...

    volatile用法.txt

    C语言常见的关键字volatile的使用以及它的两个基本用法。 1.确保本条指令不会因编译器的优化而省略 2.提醒编译器它后面所定义的变量随时都有可能改变

    volatile源码分析1

    【volatile源码分析1】 Java中的volatile关键字是一个关键的同步机制,它在多线程编程中扮演着重要的角色。在面试和技术讨论中,volatile经常成为焦点,但其工作原理却常常引发争议。本文将从JVM、C++以及汇编语言...

    const和volatile分析

    在C++编程语言中,`const`和`volatile`是两个非常重要的关键字,它们用于修饰变量,赋予变量特殊的属性。这两个关键字在理解程序的行为、内存模型以及多线程编程中起到至关重要的作用。在此,我们将深入探讨`const`...

Global site tag (gtag.js) - Google Analytics