使结构可变易变是否使所有成员可变易变?


96

如果我有:

struct whatever {
int data;
};
volatile whatever test;
也会test.data挥发吗?


4
很好的问题。我读到拥有volatile成员函数只会使this指针易变,因此每次访问成员时都会从内存中读取成员,但不会“正式”地改变成员。
Alexandre C. 2010年

2
可能是重复的,但仍然是一个很好的问题。
谢尔盖·塔切诺夫

Answers:


119

可以问另一个问题(或者只是看原始问题的另一种方式):

构造一个结构是否使其const所有成员成为成员const

如果我有:

struct whatever { int data; };

const whatever test;

test.data const也会吗?

我的回答是:可以。如果声明类型的对象whateverconst它所有的成员将const

同样,如果你声明类型的对象whatevervolatile那么它的所有成员将volatile过,就像如果你声明与对象const,所有它的成员将是const太多。

const并且volatile是同一枚硬币的两个面;因此,标准经常将它们称为cv-qualifiers


从标准报价($ 7.1.5.1 / 8)

[注:volatile是实现的一种暗示,可以避免涉及对象的积极优化 因为对象的值可能通过实现无法检测到的方式进行更改。有关详细的语义,请参见1.9。通常,volatile的语义在C ++中与在C中相同。

这意味着,如果您的对象是结构的实例,则编译器无法避免涉及该对象的积极优化除非它避免对其每个成员的积极优化。(否则,它又如何避免涉及对象的优化?)


相关主题:

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


重要的是要注意,常数仅传播给直接成员。如果您的结构包含指向某个对象的指针,则指针本身将为const(例如,您将无法重新分配它),但是您将能够更改所指向的对象。(假设您的结构没有找到指向const的指针)
Pablo Arias

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.