备注:volatile的确切含义与机器有关,只能通过阅读编译器文档来理解。要想让使用了volatile的程序在移植到新机器或新编译器后仍然有效,通常需要对该程序进行某些改变。

  直接处理硬件的程序常常包含这样的数据元素,它们的值由程序直接控制之外的过程控制。例如,程序可能包含一个由系统时钟定时更新的变量。当对象的值可能在程序的控制或检测之外被改变时,应该将对象声明为volatile。关键字volatile告诉编译器不应该对这样的对象进行优化。

  volatile限定符的用法和const很相似,它起到对类型额外修饰的作用:

volatile int display_register;//该int值可能发生变化
volatile Task *curr_task;//curr_task指向一个volatile对象
volatile int iax[max_size];//iax的每个元素都是volatile
volatile Screen bitmapBuf;//bitmapBuf的每个成员都是volatile

  const和volatile限定符互相没有什么影响,某种类型可能既是const的也是volatile的,此时它同时具有两者的属性。

  就像一个类可以定义const成员函数一样,它可以将成员函数定义成volatile的,只有volatile的成员函数才能被volatile的对象调用。

  const限定符和指针的相互作用,在volatile限定符和指针之间也存在类似的关系。我们可以声明volatile指针,指向volatile对象的指针以及指向volatile对象的volatile指针:

volatile int v;//v是一个volatile int
int *volatile vip;//vip是一个volatile指针,它指向int
volatile int *ivp;//ivp是一个指针,它指向一个volatile int
//vivp是一个volatile 指针,它指向一个volatile int
volatile int *volatile vivp;int *ip=&v;//错误,必须使用 指向volatile的指针
ivp=&v;//正确,ivp是一个指向volatile的指针
vivp=&v;//正确,vivp是一个指向volatile的volatile指针

  和cosnt一样,我们只能将一个volatile对象的地址(或者拷贝一个指向volatile类型的指针)赋给一个指向volatile的指针。同时,只有当某个引用是volatile的时,我们才能使用一个volatile对象初始化该引用。

合成的拷贝对volatile对象无效

  cosnt和volatile的一个重要区别是我们不能使用合成的拷贝/移动构造函数及赋值运算符初始化volatile对象或从volatile对象赋值。合成的成员接受的形参类型是(非volatile)常量引用,显然我们不能把一个非volatile引用绑定到一个volatile对象上。

  如果一个类希望拷贝、移动或者赋值它的volatile对象,则该类必须自定义拷贝或移动操作。例如,我们可以将形参类型指定为const volatile引用,这样我们就能利用任意类型的Foo进行拷贝或赋值操作了:

class Foo
{
public:Foo(const volatile Foo&);//从一个volatile对象进行拷贝//将一个volatile对象赋值给一个非volatile对象Foo& operator=(volatile const Foo&);//将一个volatile对象赋值给一个volatile对象Foo& operator=(volatile const Foo&)volatile;//Foo类剩余的部分
};

  尽管我们可以为volatile对象定义拷贝和赋值操作,但是一个更深层次的问题是拷贝volatile对象是否有意义?不同程序使用volatile的目的各不相同。

摘抄自《C++ primer》(第五版)P757

转载于:https://www.cnblogs.com/wuyepeng/p/9784922.html

volatile限定符相关推荐

  1. C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示

    C++ 学习笔记(19)new/delete表达式.定位new.typeid.dynamic_cast.type_info.枚举类型.成员函数指针.union.位域.volatile限定符.链接指示 ...

  2. 固有的不可移植的特征之volatile限定符

    volatile的确切含义与机器相关,只能通过阅读编译器文档来理解,使用volatile的程序在移到新的机器或编译器时通常必须改变. 直接处理硬件的程序常具有这样的数据成员,它们的值由程序本身直接控制 ...

  3. volatile限定符{C}

    PS: ...Newbie love coding-  Linux_c一站式编程(volatile限定符介绍) linux_c的volatile限定符 现在探讨一下编译器优化会对生成的指令产生什么影响 ...

  4. C语言 const、volatile、const volatile限定符理解

      在C语言经常会用到变量类型限定符const和volatile,但是const和 volatile也可以一起使用.下面就一次分析一下这三种情况的使用方法. 1.const   从字面意思理解,意思就 ...

  5. volatile限定符——C++讲解

    1.使用volatile的背景 直接处理硬件的程序常常包含这样的数据元素,它们的值由程序直接控制之外的过程控制.举例如下 : i.程序可能包含一个由系统时钟定时更新的变量.当对象的值可能在程序的控制或 ...

  6. 细谈volatile限定符——上海先锋商泰面试归来

    volatile的本意是"易变的",由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化.比如: static int i=0; int main(voi ...

  7. C语言volatile类型限定符详解

    一.volatile类型限定符 volatile是一个类型修饰符(type specifier),就像我们熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量:volatile的作用是作 ...

  8. c语言restrict和const,C语言中const、volatile、restrict等类型限定符的区别

    auto.register.static.extern是属于存储类修饰符.在声明时,存储类修饰符最多只能使用一个,而且无法用在typeof声明中. 而类型限定符是指const.volatile.res ...

  9. C语言中的类型限定符有哪些?

    C语言中有一些关键字起到了限定的作用,他们被称为限定符,那么在C语言中共有几个限定符呢?他们的作用分别是什么呢?本文主要介绍C中4个限定符 1.const2.volatile3.restrict4._ ...

最新文章

  1. Java解决百马百担问题
  2. Jar/War/Ear等包的作用与区别详解
  3. 数据存储之-SQLite数据库二
  4. #6682. 梦中的数论(Min25筛)
  5. [react] 说说你对Relay的理解
  6. STP端口状态特点、STP端口角色特点、链路状态发生变化,STP如何重新收敛? TCN何时发?uplinkfast技术、Portfast技术、backbonefast技术、常见的STP调整命令:
  7. Linux下高效编写Shell——shell特殊字符汇总
  8. 菜鸟的Hadoop快速入门
  9. 《机器人学导论》Matlab计算坐标系变换矩阵
  10. 邮件服务器的功能以及相关工作原理
  11. 隔离DCDC电源模块和非隔离DCDC电源模块不同之处
  12. Android动画学习之帧动画二
  13. 毕业设计 - 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现
  14. 公众号800篇文章分类和索引
  15. [逻辑]-- 25匹马赛跑问题
  16. 图片文字识别软件有哪些?这几款软件亲测非常好用
  17. 拼多多客户差评回复话术
  18. asyne和await
  19. python基础语法(一)range函数
  20. php api视频教程,PHP开发APP接口视频教程

热门文章

  1. Linux设备驱动编程第三版-笔记
  2. 三角形面积的两种计算方法
  3. VirtualBox靶机启动失败:end Kernel panic - not syncing: Attempted to kill the idle task
  4. APICloud平台的融云2.0集成
  5. Java Runtime.exec() hangs
  6. spirngcloud
  7. 台积电:3纳米芯片工厂地址首选台湾 美国次之
  8. 关于android 电池的一些实用性探讨
  9. OpenHarmony 内核 liteos_A和lite_M
  10. 项目经理产品经理必看,流程图绘制Drawio