C++中的volatile
2015-11-09 11:30
501 查看
引子
在阅读代码的过程中,相信大家都遇到过”volatile”这个关键字,有的人知道和编译器优化相关,甚至有的人根本不知道该关键字的功用volatile
A type qualitier that you can use to declare that an object can be modified in the program by the hardware. —[volatile]考虑下面的代码:
int some_int = 100; while (some_int == 100) { // your code }
当这个程序编译的时候,编译器如果发现这个程序永远都不会改变”some_int”的值,有可能会优化这个代码。编译器会尝试优化while循环,将”while(some_int == 100)” 简单的替换成”while(true)”,这样程序执行起来会稍微快一点。如果编译器没有对该段代码进行优化,每次循环时都会从内存读取该变量的值(如果没有将其放入寄存器的情况下),并与100进行比较。
但是有时候这种优化并不是我们所想的,如果有人想从程序外部编译器所没有意识到的地方对some_int进行修改,那么就会出错。所以为了确保正确的行为,你必须确保编译器不会因为想要优化”while(loop)”而优化掉”some_int”变量。volatile关键字就是用于这些场合的。比如:
volatile int some_int = 100;
换句话说,volatile关键字告诉编译器不要扮演上帝的角色而对代码进行任意的优化。
C++ Standard ($7.1.5.1/8):volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation. — [volatile]
volatile关键就是一个类型限定符,用来声明有可能被操作系统,硬件,或者在多线程环境中修改的对象。
volatile对象就是被volatile关键字修饰的对象或者它的子对象是一个volatile对象。每次对volatile对象进行访问(读写或者成员函数调用等),对象都会产生可见的副作用(即使在优化的情况下)。在单线程的情况下,volatile对象的访问不会被重排序或者优化掉。
相关文章推荐
- C++之namespace命名空间
- vector C++ 函数库用法
- C++ STL 之 map
- vc++6.0快捷键
- C++运算符重载整理2
- Beaglebone Black(6.1)Beaglebone Black的c++开发环境Eclipse构建
- poj 1328 贪心算法和快排(快排细节)
- poj2253 用dijkstra计算最短路径的两个结点的最短长度
- dev_C++ 不能调试问题解决
- C++ 类内部的成员变量的内存分布
- C++运算符重载整理
- c++ 原子操作
- C++中的强制类型转换
- keil 中——C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
- c语言实现封装、继承和多态
- DOxygen for C++使用说明——添加数学公式
- 《C++程序设计教程——给予Visual Studio 2008》读书笔记3章
- C++面向对象操作符重载:输入输出操作符
- 从C++到Qt(命令行编译,讲解原理)
- Generate C and C++ Header File