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

时间: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读书笔记)

时间: 2024-11-17 22:58:50

C++中的volatile(Primer读书笔记)的相关文章

C++primer读书笔记11-多态

多态也是C++中的一个重要的方面,多态和动态类型,虚函数本质上是指相同的事情. 1 虚函数 类中的成员函数原型前面加上virtual 表面这个函数是个虚函数.虚函数的目的是为了在继承它的派生类中重新定义这个函数,以便于通过基类的指针或引用在运行时对派生类的函数进行调用. 2 派生类和虚函数 派生类一般情况下要重定义所继承的虚函数,有几个注意事项. <1>虚函数的声明必须和基类中的函数声明原型完全一致,例外的是当基类返回基类型的指针或者引用的时候,派生类可以派生类类型的指针或者引用 <2&

C++ primer读书笔记10-继承

封装,继承,多态是C++的三大基本概念,这里着重总结一下继承相关的东西 1 类派生列表 类派生列表指定派生类要继承的基类,派生列表中有一个或者多个基类如: class B : public A1,protected A2,private A3 但是单继承时最常见的,多继承不多见 2 派生类的定义 派生类继承时,会包含父类的所有成员,即便私有成员不能被访问.父类中的虚函数,在派生类中一般也要定义,如 果不定义的话,派生类将继承基类的虚函数 3 基类必须是已经定义的 一个仅仅声明的类,是不能出现在派

C++primer读书笔记9转换与类类型

有时候指定了自己类类型来表示某种类型数据如SmallInt,那么为了方便计算就会指定一个转换操作符,将该类类型在某种情况下自动的转换为指定的类型 <1>转换操作符 operator type(); 转换函数必须是类成员函数,不能指定返回类型,并且形参列表必须为空,并且通常不应该改变转换对象,所以操作符通常定义为const成员. #include <iostream> using namespace std; class SmallInt { public: SmallInt(int

linux中proc文件系统 -- ldd3读书笔记

1./proc 文件系统概述 /proc 文件系统是由软件创建,被内核用来向外界报告信息的一个文件系统./proc 下面的每一个文件都和一个内核函数相关联,当文件的被读取时,与之对应的内核函数用于产生文件的内容.我们已经见到了很多这样的文件,例如,/proc/modules 总是返回当前内核中加载的模块. /proc 广泛的应用在 linux 文件系统中,现代 linux 发行版上的许多应用程序,例如 ps ,top 和 uptime 都从 /proc 获取他们所需要的信息.一些驱动程序也通过

C++ Primer 读书笔记整理(一)

1.读取数量不定的输入数据时可以把cin语句放到条件判断语句中,如果流的状态有效则读取成功,否则读取失败. 例如: while(cin>>value) /* do something */ 2.顶层const与底层const的区别 1)顶层const表示任意的对象是const(即常量) 例如: const int value = 0; // i是顶层const常量 int i= 0; int *const ptr = &i; //ptr是顶层const常量 2)底层const一般用在引

c++ primer读书笔记之c++11(二)

1 新的STL模板类型,std::initializer_list<T> c++11添加了initializer_list模板类型,用于提供参数是同类型情况的可变长度的参数传递机制,头文件是<initializer_list>. 其具体接口可参考cplusplus.com的介绍,地址如下:http://www.cplusplus.com/reference/initializer_list/initializer_list/?kw=initializer_list 与vector不

c++ primer读书笔记之c++11(四)

1  带有作用域的枚举 scoped-enumeration 相信大家都用过枚举量,都是不带有作用域的,在头文件中定义需要特别注意不要出现重名的情况.为了解决这种问题,c++11提供了带作用于的枚举.可以使用class EnumName定义,示例代码如下: enum {ZERO, ONE, TWO}; enum class color {RED, BLUE, GREEN}; 上面的是没有作用域的枚举定义形式,下面是带有作用域的枚举定义形式,调用带有作用域的枚举必须指定作用域,否则会编译出错. 还

c++ primer读书笔记之c++11(三)

1 =default构造函数限定符 c++11针对构造函数提供了=default限定符,可以用于显式指定编译器自动生成特定的构造函数.析构或赋值运算函数.参考代码如下: class CtorDftType { public: CtorDftType()=default; CtorDftType(const CtorDftType&)=default; CtorDftType & operator = (const CtorDftType &)=default; ~CtorDftTy

函数(C++ Primer读书笔记)

C++ Primer 第五版课后题 练习6.32 :下面的函数合法吗?如果合法,说明其功能:如果不合法,修改其中的错误并解释原因. #include <iostream> using namespace std; int &get(int *arry, int index) { return arry[index]; } int main() { int ia[10]; for (int i = 0; i != 10; ++i) get(ia, i) = i; return 0; }