C++ volatile

原创 2016年03月05日 21:52:26

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.

书籍中的解释很明显,对编译器的一种提示,从而避免编译器优化和稳定访问取值。

编译器优化

//代码来源于别人的博客,http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.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】http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html

C++常见面试题:虚函数实现原理

转载地址:http://blog.csdn.net/wanghaobo920/article/details/7674631 前言 C++中的虚函数的作用主要是实现了多态的...
  • zjuxsl
  • zjuxsl
  • 2015年03月30日 21:08
  • 792

Google Round A China New Grad Test 2014

谷歌校招第一次机试结果:https://code.google.com/codejam/contest/2924486/scoreboard# 可以从上述网址查询结果,也可以下载大牛的代码,看看大牛的...

C++ volatile 详解

  • 2013年03月05日 16:18
  • 88KB
  • 下载

C++中的volatile(Primer读书笔记)

C++中的volatile(Primer读书笔记)

C++中volatile及编译器优化

修饰符volatile定义了一个“易变的、不稳定的、随时可能改变的”变量,对于被声明为volatile的变量的使用上跟普通的变量没有什么区别,最大的影响,就是编译器不能按照常规方式对其进行优化。 这就...
  • dcrmg
  • dcrmg
  • 2016年07月19日 21:39
  • 1684

详解VOLATILE在C++中的作用

VOLATILE的介绍       volatile类似于大家所熟知的const也是一个类型修饰符。volatile是给编译器的指示来说明对它所修饰的对象不应该执行优化。volatile的作用就...

C/C++中volatile关键字详解

原文http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html 1. 为什么用volatile?     C/C...

c++ Volatile关键词深度剖析

原文地址:何登成的技术博客 http://hedengcheng.com/?p=725\* int setjmp(jmp_buf env) 创建本地的jmp_buf缓冲区并且初始化,用于将来跳转...

C/C++中volatile关键字详解

原文:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html 1. 为什么用volatile?     C/C++ ...

详解VOLATILE在C++中的作用

详解VOLATILE在C++中的作用 VOLATILE的介绍       volatile类似于大家所熟知的const也是一个类型修饰符。volatile是给编译器的指示来说明对它所修饰的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ volatile
举报原因:
原因补充:

(最多只允许输入30个字)