volatile的确切含义与机器相关,只能通过阅读编译器文档来理解,使用volatile的程序在移到新的机器或编译器时通常必须改变。

直接处理硬件的程序常具有这样的数据成员,它们的值由程序本身直接控制之外的过程所控制。例如,程序可以包含由系统时钟更新的变量,当可以用编译器的控制或检测之外的方式改变对象值的时候,应该将对象声明为volatile。关键字volatile是给编译器的指示,指出对这样的对象不应该执行优化。

用与const限定符相同的方式使用volatile限定符。volatile限定符是一个对类型的附加修饰符:

volatile int display_register;

volatile Task *curr_task;

volatile int ixa[max_size];

volatile Screen bitmap_buf;

display_register是int类型的volatile对象;curr_task是volatile对象的指针;ixa是整数的volatile数组,该数组的每个元素都被认为是volatile的;bitmap_buf是volatile Screen对象,它的每个成员都认为是volatile的。

用与定义const成员函数相同的方式,类也可以将成员函数定义为volatile,volatile对象只能调用volatile成员函数。

const限定符与指针之间的相互作用,volatile限定符与指针之间也存在同样的相互作用。可以声明volatile指针、指向volatile对象的指针,以及指向volatile对象的volatile指针:

volatile int v;       // v is a volatile int

int *volatile vip;    // vip is a volatile pointer to int

volatile int *ivp;    // ivp is a pointer to volatile int

volatile int *volatile vivp;    // vivp is a volatile pointer to volatile int

int *ip = &v;    // error: must use pointer to volatile

*ivp = &v;       // ok: ivp is pointer to volatile

vivp = &v;      // ok: vivp is volatile pointer to volatile

像用const一样,只能将volatile对象的地址赋给指向volatile的指针,或者将指向volatile类型的指针复制给指向volatile的指针。只有当引用为volatile时,我们才可以使用volatile对象对引用进行初始化。

合成的复制控制不适用于volatile对象

    对待const和volatile的一个重要区别是,不能使用合成的复制和赋值操作符从volatile对象进行初始化或赋值。合成的复制控制成员接受const形参,这些形参是对类类型的const引用,但是,不能将volatile对象传递给普通引用或const引用。

如果类希望允许复制volatile对象,或者,类希望允许从volatile操作数或对volatile操作数进行赋值,它必须定义自己的复制构造函数和/或赋值操作符版本:

class Foo{

public:

Foo(const volatile Foo&);     // copy from a volatile object

// assign from a volatile object to a non volatile object

Foo& operator = (volatile const Foo&);

// assign from a volatile object to a volatile object

Foo& operator = (volatile const Foo&) volatile;

// remainder of class Foo

};

通过将复制控制成员的形参定义为const volatile引用,我们可以从任何种类的Foo对象进行复制或赋值:普通Foo对象、const Foo对象、volatile Foo对象或const volatile Foo对象。

虽然可以定义复制控制成员来处理volatile对象,但更深入的问题是复制volatile对象是否有意义,对该问题的回答与在任意特定程序中使用volatile的原因密切相关。

固有的不可移植的特征之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++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“volatile”

    1. volatile 限定符 当对象的值可能在程序的控制或检测之外被改变时, 应该将该对象声明为 volatile volatile int display_register; //display_ ...

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

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

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

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

最新文章

  1. nvm 下载node 下载不下来_一键下载网页所有图片,把美丽存下来
  2. OpenCV Resize Reshape
  3. c# 对象json互相转换_C#匿名对象(转JSON)互转、动态添加属性
  4. Java设计模式理论知识要点总结
  5. 数据库的UNDO和REDO
  6. CSS中的Position属性
  7. oracle 存储过程获取当前日期
  8. RHEL5实现YUM本地源的配置
  9. 数据库开发文档记录方法
  10. 二分法01:查找一个数
  11. 51nod 博弈论水题
  12. 威联通NAS TS-873A 实测
  13. 【Python实战系列】串口实时接收数据并基于pyqtgraph绘图
  14. 国货当自强!四款好用又免费的国产项目管理工具
  15. 工程项目常见风险及其22种最佳管理实践
  16. 多测师肖sir_高级金牌讲师_项目介绍之保险项目的案例
  17. 手机wifi延迟测试软件,测网速延迟(如何测试wifi延迟)
  18. 软件研发管理最佳实践(2012-10-20 深圳)
  19. CSS3视窗单位vw、vh、vmin、vmax说明
  20. Java Socket 参数详解

热门文章

  1. 关于将EXCEL文件导入到MYSQL数据库的一些方法
  2. springboot请求put请求
  3. 抖音小店另类起店方法
  4. 对抗样本生成方法论文阅读笔记
  5. 使用aspose.word.for.java解析word文档图片并替换
  6. git push错误(fatal: The upstream branch of your current branch does not match)解决方案
  7. Object C基础
  8. 给女朋友明天一条贴心消息【公众号推送】
  9. word、excel文档内容更新技术方案
  10. 解决XAMPP中无法勾选/无服务/modules无反应/Service灰框/无✓X/提供虚拟服务器