如果我有:
struct whatever {
int data;
};
volatile whatever test;
那么test.data
也会是易失性的吗?struct whatever {
int data;
};
volatile whatever test;
那么test.data
也会是易失性的吗?还可以提出另一个问题(或者说,从另一种角度看待原来的问题):
const
,会使得其所有成员都变成const
吗?如果有这样一个结构体:
struct whatever { int data; };
const whatever test;
test.data也会是const
吗?
我的回答是:是的。如果你使用const
声明一个类型为whatever
的对象,那么它的所有成员也将是const
。
同样地,如果你用volatile
声明一个类型为whatever
的对象,那么它的所有成员也将是volatile
。正如如果你用const
声明该对象,它的所有成员也将是const
。
const
和volatile
是同一枚硬币的两面;标准通常将它们称为cv-qualifier
。
引用标准文件($ 7.1.5.1/8)
[注:volatile是对实现提示,避免涉及对象的激进优化,因为对象的值可能会因实现无法检测到的手段而改变。有关详细语义,请参见1.9。总体上,volatile 的语义意图与 C 语言相同。]
这意味着,如果你的对象是一个结构体的实例,那么编译器无法避免涉及该对象的激进优化,除非它避免优化每一个成员。 (否则,不然它怎么能避免涉及该对象的优化呢?)
相关主题:
const
对象,那么它的所有成员都不是const
。例如,您可以拥有mutable
成员。 - user904963const
的传播是因为如果类 A 有一个类 B 的成员 b,那么这个成员将是 const 的,所以 b 的成员也将是 const 的。对于指针而言,只有指向的地址是常量。通过解引用它,您并没有修改指针本身(它是常量),而是修改了它所指向的对象。 - Maximilian Mordig来源:http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx
要将指针所指向的对象声明为const或volatile,请使用以下形式的声明:
const char *cpch;
volatile char *vpch;
要声明指针的值 - 即指针中存储的实际地址 - 为const或volatile,请使用以下形式的声明:
char * const pchc;
char * volatile pchv;
volatile
成员函数只会让this
指针变成 volatile,所以每次访问成员时,它们会从内存中读取,但并不是 "正式" 的 volatile。 - Alexandre C.