`
wujianjun0410
  • 浏览: 104158 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c++ volatile的用法

阅读更多
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值(From Memory),而不是使用保存在寄存器里的备份。下面是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;
}


volatile 相当于告诉编译器, 由它声明的东西的易变的, 不确定的, 可能由外部程序 (如中断程序) 改变的, 禁止编译器对其读写操作进行优化, 如果定义:
int i;
则编译器可能会将其优化, 而放到 CPU 寄存器中, 这在多数情况下是好的, 然而在有些情况下, 我们会要求一些变量必须在内存中 (如驱动程序, 中断处理程序等等), 这时编译器这个优化就是引起问题, 为了避免这种情况, 应该这样定义:
volatile int i;

PS: volatile 通常也用来阻止编译器具优化操作, 如你有一个非精确延时函数:
void delay(unsigned int timeout)
{
unsigned int i;
for (i = 0; i < timeout; i++);
}

有些编译会足够聪明地注意到这个函数本质上是什么也没干, 会将针对这个函数的调用优化掉, 但这样是不对的, 所以你应该这么声明:
volatile void delay(...)
{
// 同上
} 

分享到:
评论

相关推荐

    C/C++牛人Dan Sakes关于Volatile用法的总结

    C/C++牛人Dan Sakes关于Volatile用法的总结。 Dan Saks is one of the world's leading experts on the C and C++ programming languages and their use in developing embedded systems. He provides training and ...

    C++中volatile和mutable关键字用法详解

    C++中volatile和mutable关键字用法详解 C++中volatile关键字的用法详解: volatile关键字是C++中的一种类型限定符,它用于告诉编译器该变量值是不稳定的,可能被更改。使用volatile注意事项有六点: 1. 编译器会...

    const,extern,static,volatile的使用

    ### const、extern、static、volatile 的使用详解 #### 一、const 的使用 **1. 为什么使用 const** `const` 关键字在 C 和 C++ 编程语言中非常常见,它用来声明一个常量或者指定某个变量的某个方面为不可变。使用...

    C++中volatile关键字及常见的误解总结

    C++中volatile关键字及常见的误解总结 C++中的volatile关键字是一种类型修饰符,用来修饰变量,表示该变量可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。 volatile关键字的主要作用是提供对...

    聊聊C++的mutable和volatile

    C++中修饰数据可变的关键字有三个:const、volatile和mutable。const比较好理解,表示其修饰的内容不可改变(至少编译期不可改变),而volatile和mutable恰好相反,指示数据总是可变的。mutable和volatile均可以和...

    C++中const、volatile、mutable使用方法小结

    C++中const、volatile、mutable使用方法小结 C++中const、volatile、mutable是三个重要的关键字,它们在日常编程中经常被使用,但是很多人对它们的理解和使用都不是很清楚。下面我们将对这三个关键字的使用方法进行...

    extern_volatile等修饰符的用法

    "extern_volatile等修饰符的用法" 在C++语言中,extern、volatile、const、static等...extern、volatile、const、static等修饰符都是C++语言中的重要组成部分,正确使用它们可以提高代码的可读性、安全性和可维护性。

    volatile源码分析1

    本文将从JVM、C++以及汇编语言的角度深入探讨volatile的两大特性:禁止重排序和内存可见性。 1. 禁止重排序 重排序是指编译器和处理器为了优化性能而可能对指令序列进行重新排列的一种行为。在Java中,volatile...

    const和volatile分析

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

    深入理解 `volatile` 关键字:用法、误区与最佳实践

    在C和C++编程中,volatile 关键字是一个修饰符,用于告知编译器一个变量的值可能会在程序的控制之外随时改变。这通常与硬件操作、多线程环境或某些特殊的内存访问相关。正确使用 volatile 是确保程序正确性和稳定性...

    volatile和原子操作有没有关系,我的实验+别人论文

    第一种方法是使用volatile关键字来声明变量g_count,以确保其值是最新的。第二种方法是使用原子操作来实现g_count的自增操作。 在我们的实验结果中,我们可以看到,使用volatile关键字可以确保g_count的值是正确的...

    Effective_Modern_C++_中文版

    它描述的正是使用C++11和C++14——现代C++来撰写真正卓越的软件之道。 涵盖以下主题: 大括号初始化、noexcept规格、完美转发,以及智能指针的make函数的优缺点 std::move、std::forward、右值引用和万能引用之间...

    volatile的作用

    `volatile`的高级用法 #### (3.1) 确保可见性 当多个线程访问同一个变量时,为了保证数据的一致性和可见性,可以使用`volatile`关键字。例如,在多线程环境中,如果一个线程修改了一个变量,而另一个线程需要读取...

    c++标准手册 ISO C++ Standard

    C++是一种广泛使用的面向对象的编程语言,由Bjarne Stroustrup于1979年在贝尔实验室创建,作为C语言的扩展。C++标准手册是定义C++语言规范的关键文档,它确保了编译器制造商和程序员有一个共同理解和遵循的语言标准...

    Effective.Modern.C++-42.Specific.Ways.to.Improve.Your.Use.of.C++11.and.C++14

    本书探讨了在新时代下,如何根据现代C++的新特性来调整和优化编程方法。 作者Scott Meyers拥有布朗大学计算机科学博士学位,多年来以其清晰、引人入胜的风格讲解复杂技术问题而广受欢迎。他不仅是训练师、顾问,也...

    volatile 的作用

    ### volatile 的作用 在计算机编程领域,`volatile` 是一个非常重要的关键字,尤其是在涉及多线程编程、嵌入式系统开发等场景时。...理解其工作原理及正确使用方法对于编写高效、可靠的软件系统至关重要。

    volatile的用法

    ### volatile的用法详解 #### 一、volatile的基本概念 `volatile`是一个关键字,用于声明一个变量的状态可能会在外部被改变。它告诉编译器不要对该变量进行优化,确保每次对该变量的操作都是直接访问内存中的实际...

    volatile,nonatomic和atomic关键字测试

    首先,`volatile`是一个C/C++关键字,也被Objective-C所采纳。它告诉编译器,变量的值可能会在编译器无法察觉的情况下改变,比如由硬件中断、多线程中的其他线程修改或其他非局部效应引起。在多线程环境中,如果一个...

Global site tag (gtag.js) - Google Analytics