时间:2014.05.24

地点:基地

--------------------------------------------------------------------------

一、简述

volatile限定符平时很少用到,今天倒是碰到了,所幸探个明白。volatile 英文字面意思是“不稳定的”,确切的计算机含义时与机器相关,所以在对包含volatile的程序在移植到新机器或使用不同的编译器时往往还需要对编译器进行一些改变。

--------------------------------------------------------------------------

二、为什么要有volatile这么个怪物

某些应用程序需要直接操作硬件相关的数据,这些数据的值由程序直接控制之外的过程控制。即该数据的值是不受程序直接控制的,但程序又要用到它,比如由硬件系统时钟更新的定时器变量。当对象的值可能在程序的控制或检测之外被改变时我们应该将对象声明为volatile。告诉编译器该对象不该进行优化处理。

volatile和const一样,只是一个对类型的修饰符。我们可以这样用:

volatltle int display_register; //该int值是可变的
volatitle Task *curr_task;  //curr_task指向一个volatile对象
volatitle int iax[max_size];  //数组iax中的每个元素都是volatitle
volatitle Screen bitmapBuf;  //bitmapBuf的每个成员都是volatile

另外volatile 和 const虽然用法类似,但相互之间互不影响,可结合使用,再看几个volatile的类似用法

volatile int v;  //v是一个volatile int
int* volatile vip;  //vip是一个volatile指针,指向intl类型对象
volatile int *ivp;  //ivp是一个指针,指向一个volatile int 对象
volatile int* volatile vivp;  //vivp是一个volatile指针,指向一个volatile int 对象

现在,我们进行如下赋值

int* ip=&v;  //错误,ip是一个普通指针,不能指向volatile对象
ivp=&v;       //ivp可指向volatile对象,正确
vivp=&;    //vivp可指向volatile对象,正确,同时它也是一个volatile指针

--------------------------------------------------------------------------
三、合成的拷贝对volatile对象无效

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

如果一个类希望拷贝、移动或赋值它的volatile对象,则该类必须自定义拷贝或移动操作。比如将形参类型指定为const volatile引用,如此才可正确实现对任意类型对象的拷贝或赋值。

class Foo
{Foo(const volatile Foo&);//从一个volatile对象进行拷贝Foo& operator=(volatile const Foo&);//将一个volatile对象赋值给一个非volatile对象Foo& operator=(volatile const Foo&) volatile;  //将一个volatile对象赋值给一个volatile对象
}

上面有一点:就是我们在类中可以就像定义const成员函数一样,我们也定义volatile成员函数,这时只有volatile成员函数才能被volatile对象调用。即就是const对象只能调用const成员函数一样,volatile对象只能调用volatile成员函数。

C++中的volatile(Primer读书笔记)相关推荐

  1. C++ Primer 读书笔记04

    C++ Primer 读书笔记04 关联容器 pair 动态内存 静态内存 栈内存 智能指针 shared_ptr 直接管理内存 new 空悬指针 智能指针陷阱 unique_ptr weak_ptr ...

  2. C++ Primer 读书笔记及知识点延伸 chapter2

    C++ Primer 读书笔记及知识点延伸 chapter2 wchar_t宽字符,char16_t  char32_t Unicode字符 ,long long C++11新增加 符号类型前面加上u ...

  3. c++primer读书笔记

    c++全局变量无声明.多次定义会冲突.利用命名空间 c++四种cast操作符的区别 1.static_cast,支持子类指针到父类指针的转换,并根据实际情况调整指针的值,反过来也支持,但会给出编译警告 ...

  4. C++ Primer读书笔记(从后向前看)

    (从后向前看) 标题:重载函数再论 重载函数是C++提出来的概念,但是在C中却未必没有.比如"1+3"和"1.0+3.0",虽然都是加法,做的却不是同的操作:编 ...

  5. C++ Primer读书笔记

    (从后向前看) 标题:重载函数再论 重载函数是C++提出来的概念,但是在C中却未必没有.比如"1+3"和"1.0+3.0",虽然都是加法,做的却不是同的操作:编 ...

  6. 【C++ Primer读书笔记】第1章 - 开始

    读书笔记,后续会不断补充修改,欢迎交流.

  7. C++ Primer 读书笔记 (1)

    我的<C++ Primer>扉页记着购书的日期和地点:C++ Primer 2009.11.28购于西区求索.那时对于这本厚书一直心怀敬畏,仿佛是眼前的一座大山.那时,虽然已经大四,但是对 ...

  8. C++Primer读书笔记----第二章变量和基本类型

    前段时间学习iphone开发,非常力不从心,很多C/C++的类库代码看不明白.大学的时候都学过C/C++,但是基本上忘光了,现在做C#开发,经常写出来一些性能低下的代码,究其原因就是原理掌握不扎实,乱 ...

  9. C++ Primer 读书笔记及知识点延伸 chapter1

    C++ Primer  chapter 1 main函数的返回值在正常情况下为0,程序错误时可能返回其他的值 . 在编译程序时,命令行只需要包含源文件的参数 //test.hpp void test( ...

最新文章

  1. 个人知识管理系统 mysql_个人知识管理系统Version1.0开发记录(04)
  2. 1080 两个数的平方和(数学)
  3. [Python]--Anaconda Resources Collection
  4. cache 的设计与实现--转载
  5. luogu P2512 [HAOI2008]糖果传递
  6. observable_Java Observable countObservers()方法与示例
  7. CYQ.Data 轻量数据层之路 应用示例一 留言版(四)
  8. MFC中的CString类使用方法指南
  9. Python 数据科学手册 5.5 朴素贝叶斯分类
  10. java实现省市区的联动,chosen实现省市区三级联动
  11. jquery 判断checkbox是否为空的三种方法
  12. 【路径规划】基于matlab粒子群算法栅格地图路径规划【含Matlab源码 579期】
  13. java 根据助记词导入ETH钱包账户
  14. 使用FOP将xml转换pdf
  15. Vue+element实现图片的上传与显示
  16. redis挂机问题搜查纪录
  17. GCS_SERVER_PROCESSES
  18. 如何找到联盟营销人员:招募合适会员的10个方法
  19. 自动发票校验 Auto Invoice Verification
  20. 自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页

热门文章

  1. Spring ,Spring Tolls Suit 任何版本下载
  2. 网页设计配色应用实例剖析——橙色系
  3. opengl android 纹理贴图 代码,Android 使用opengl es的纹理贴图白屏问题请教。
  4. 中止执行后超过2年_超过两年是否可以申请强制执行
  5. 82.android 简单的当前运行内存清理
  6. 用速腾16线激光雷达跑gmapping
  7. 关于支付账户体系研究
  8. 毕业设计-基于 MATLAB 的图像分割算法研究及实现
  9. mysql group_concat去重_mysql GROUP_CONCAT 函数 将相同的键的多个单元格合并到一个单元格...
  10. 罗丹明RB/四甲基罗丹明标记肌醇六磷酸/植酸,Phytic Acid, Rhodamine B/TRITC labeled;Rhodamine B/TRITC-Phytic Acid