C++ 学习笔记:C++ 中 Volatile 变量学习

转载 2016年08月30日 16:43:41


 1. 为什么用 volatile?

    C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,使用格式和 const 一样,通常用于建立语言级别的 memory barrier。这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明:

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.

      volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据,而且读取的数据立刻被保存

例如,如下代码:

int main() {
    const int i = 0;
    int *j = (int *) &i;
    *j = 1;
    printf("%d,%d", i, *j);

    return 0;
}
在 C 语言中输出结果是 1, 1,所以 C 语言可以通过指针间接修改 const 变量的值。
我们重点要说的是在 C++ 中输出结构是 0, 1原因是:
C++中的常量折叠:指 const 变量(即常量)值放在编译器的符号表中,计算时编译器直接从表中取值,省去了访问内存的时间,从而达到了优化。编译器只对 const 变量的值读取一次。所以打印 i 是 0
但是,如果加上 volatile 能做到改变 C++ 中 const 变量的值,因为,volatile 告诉编译器不要去优化这个变量,所以,常量 i 就会每次都从内存读取。

    同样,对于“内嵌汇编操纵栈”这种方式,属于编译无法识别的变量改变volatile 关键字也可以发挥了它的作用。另外更多的可能是多线程并发访问共享变量时,一个线程改变了变量的值,怎样让改变后的值对其它线程 visible。一般说来,volatile 用在如下的几个地方: 
1) 中断服务程序中修改的供其它程序检测的变量需要加 volatile; 
2) 多任务环境下各任务间共享的标志应该加 volatile; 
3) 存储器映射的硬件寄存器通常也要加 volatile 说明,因为每次对它的读写都可能由不同意义;

2.volatile 指针

    和 const 修饰词类似,const 有常量指针和指针常量的说法,volatile 也有相应的概念:

  • 修饰由指针指向的对象、数据是 constvolatile

  • 指针自身的值——一个代表地址的整数变量,是 constvolatile

    注意:

(1) 可以把一个非 volatile int 赋给 volatile int,但是不能把非volatile 对象赋给一个volatile 对象。
(2) 除了基本类型外,对用户定义类型也可以用 volatile 类型进行修饰。
(3) C++ 中一个有 volatile 标识符的类只能访问它接口的子集,一个由类的实现者控制的子集。用户只能用 const_cast 来获得对类型接口的完全访问。此外,volatile  const 一样会从类传递到它的成员。

3. 多线程下的 volatile   

    有些变量是用 volatile 关键字声明的。当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值。 


参考:这个地方

相关文章推荐

C++ Primer学习笔记——变量声明和定义

C++ primer学习笔记

C++ Primer 学习笔记_3_变量和基本类型

 变量和基本类型 引言:     1、各种程序设计语言都具有许多各具特色的特征,这些特征决定了用每种语言适合开发哪些类型的应用程序。     2、大多数现代现代程序设计语言都采...

c++ Premier 学习笔记(unit2 变量和基本类型 -声明与定义

(因为是学习笔记,很多地方直接从书上敲下来,所以归到转载这一类 变量的声明和定义的关系        为了支持分离式编译,C++语言将声明和定义区分开来。声明(declaration)...

C++ Primer学习笔记——$2 变量和基本类型

题记:本系列学习笔记(C++ Primer学习笔记)主要目的是讨论一些容易被大家忽略或者容易形成错误认识的内容。只适合于有了一定的C++基础的读者(至少学完一本C++教程)。 作者: tyc611, ...

【C++ Primer学习笔记】第2章 变量和基本类型

1、基本内置类型 整型:整数、字符、布尔值 浮点型:浮点数   2、C++的内置类型与其在计算机的存储器中的表示方法密切相关。让存储具有结构的最基本方法是用块(Chunk)处理存储。块的大小因...

C++ Primer 学习笔记(一)——变量和基本类型

一、基本内置类型与类类型 C++中数据类型分为:基本内置类型与类类型。基本内置类型指:布尔型,字符型,整型,浮点型等。 二、字面值常量 1、只有内置类型存在字面值,没有类类型的字面值。 2、定...

c++Primer学习笔记之六:变量和基本类型_2

定义 const 对象 const 限定符把一个对象转换成一个常量。  const int bufSize = 512; // input buffer size  定义 bufSize 为常量...

C++|C++学习笔记|数据、变量和计算

C++学习笔记参考书籍:《Visual C++ 2012 入门经典》

【C++】学习笔记四十——引用变量

引用变量引用是已定义的变量的别名。引用变量的主要用途是用作函数的形参。通过将引用变量用作参数,函数将使用原始数据,而不是其副本。这样除指针之外,引用也为函数处理大型结构提供了一种非常方便的途径。对于设...

c++ Premier 学习笔记(unit2 变量和基本类型-对象与初始化

(因为是学习笔记,所以很多地方直接从书上敲在电脑上,所以标记成为“转载”) 术语:何为对象?        C++程序员在很多场合都会使用对象(object)这个名词。通常情况下,对象是指一块...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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