将结构体声明为volatile是否会使其所有成员都变成volatile?

110
如果我有:
struct whatever {
    int data;
};
volatile whatever test;
那么test.data也会是易失性的吗?

4
很棒的问题。我读过,拥有一个 volatile 成员函数只会让 this 指针变成 volatile,所以每次访问成员时,它们会从内存中读取,但并不是 "正式" 的 volatile。 - Alexandre C.
2
可能是重复问题,但仍然是一个好问题。 - Sergei Tachenov
2个回答

140

还可以提出另一个问题(或者说,从另一种角度看待原来的问题):

将结构体声明为const,会使得其所有成员都变成const吗?

如果有这样一个结构体:

struct whatever { int data; };

const whatever test;

test.data也会是const吗?

我的回答是:是的。如果你使用const声明一个类型为whatever的对象,那么它的所有成员也将是const

同样地,如果你用volatile声明一个类型为whatever的对象,那么它的所有成员也将是volatile。正如如果你用const声明该对象,它的所有成员也将是const

constvolatile是同一枚硬币的两面;标准通常将它们称为cv-qualifier


引用标准文件($ 7.1.5.1/8)

[注:volatile是对实现提示,避免涉及对象的激进优化,因为对象的值可能会因实现无法检测到的手段而改变。有关详细语义,请参见1.9。总体上,volatile 的语义意图与 C 语言相同。]

这意味着,如果你的对象是一个结构体的实例,那么编译器无法避免涉及该对象的激进优化除非它避免优化每一个成员。 (否则,不然它怎么能避免涉及该对象的优化呢?)


相关主题:

为什么我们在C++中使用volatile关键字?


1
需要注意的是,const 属性仅传播到直接成员。如果您的结构体持有指向某个对象的指针,则指针本身将是 const(例如,您将无法重新分配它),但您仍然可以更改所指向的对象。(假设您的结构体不持有指向 const 的指针) - Pablo Arias
如果您拥有一个const对象,那么它的所有成员都不是const。例如,您可以拥有mutable成员。 - user904963
@PabloArias const 的传播是因为如果类 A 有一个类 B 的成员 b,那么这个成员将是 const 的,所以 b 的成员也将是 const 的。对于指针而言,只有指向的地址是常量。通过解引用它,您并没有修改指针本身(它是常量),而是修改了它所指向的对象。 - Maximilian Mordig

-3

来源: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;

5
不是回答问题的内容。 - Jakob van Bethlehem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接