C++ volatile
2016-03-05 21:52
507 查看
volatile英文的翻译是不稳定的,在C++中关键字声明表明其后变量值可能被改变,但是声明后,每次取值都是都是到内存中取值,从而防止编译器优化。
A volatile specifier is a hint to a compiler that an object may change its value in ways not specified by the language so that aggressive optimizations must be avoided.
书籍中的解释很明显,对编译器的一种提示,从而避免编译器优化和稳定访问取值。
原文博客中说,不加关键字的int i变量,在debug,和release不同,但是我尝试了下,其结果一致,都是10。而在加了关键字的release情况下,b的值才得以改变成32。说明这时候的b变量重新到i的内存空间取值,所以才有正确的结果。
再来说说,为什么不加volatile的时候,结果都是10。因为编译器比较偷懒,在给i赋值10后,其后的代码块没有修改i的值,凡是后面诸如 int a = i,是把i的值给a,而不去i的内存中读取。
综上,volatile在仅在release版本下有效。
volatile和const一样,可以修饰指针指向的值,也可修饰指针本身的值。这里指的是指针本身的值。
因为多线程情况,多个线程可能使用同一个变量,而编译器优化导致,一个线程使用寄存器的值,而一个使用内存的值,导致程序失控,出现不可控的结果。
注意,多线程当可能修改某个统一变量时,加上类型说明符 volatile
【参考资料】
【1】/article/7008855.html
A volatile specifier is a hint to a compiler that an object may change its value in ways not specified by the language so that aggressive optimizations must be avoided.
书籍中的解释很明显,对编译器的一种提示,从而避免编译器优化和稳定访问取值。
编译器优化
//代码来源于别人的博客,/article/7008855.html #include <stdio.h> void main() { volatile 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); }
原文博客中说,不加关键字的int i变量,在debug,和release不同,但是我尝试了下,其结果一致,都是10。而在加了关键字的release情况下,b的值才得以改变成32。说明这时候的b变量重新到i的内存空间取值,所以才有正确的结果。
再来说说,为什么不加volatile的时候,结果都是10。因为编译器比较偷懒,在给i赋值10后,其后的代码块没有修改i的值,凡是后面诸如 int a = i,是把i的值给a,而不去i的内存中读取。
综上,volatile在仅在release版本下有效。
多线程的volatile
参考我《C++ 单例模式》中成员变量m_pInstance的声明,static T* volatile m_pInstance;
volatile和const一样,可以修饰指针指向的值,也可修饰指针本身的值。这里指的是指针本身的值。
因为多线程情况,多个线程可能使用同一个变量,而编译器优化导致,一个线程使用寄存器的值,而一个使用内存的值,导致程序失控,出现不可控的结果。
注意,多线程当可能修改某个统一变量时,加上类型说明符 volatile
【参考资料】
【1】/article/7008855.html
相关文章推荐
- c++ 继承 多重继承 多态性 虚函数
- 重建二叉树(C++递归实现)
- C/C++中的sizeof运算符
- 单片机C语言 if与#if
- C++11 智能指针——unique_ptr
- C++多态与可变参数混搭的奇妙之处
- 怎么用C语言编 电影院售票系统
- C语言中易错的问题(持续更新)
- C++程序员面试宝典——基本概念易错题
- C++中引用与指针的区别(详细介绍)
- static 和 const
- c++动态内存管理
- java,c++,c#定义数组
- c语言基础函数——fork()
- 面试题之C语言
- C++未经初始化
- C语言
- c语言易错基础知识
- 堆排序
- .使用malloc开辟一个3*4的二维数组,并将内容初始化为0-11