【问题标题】:Does making a struct volatile make all its members volatile?使 struct volatile 会使它的所有成员 volatile 吗?
【发布时间】:2011-05-27 15:32:33
【问题描述】:

如果我有:

struct whatever {
int data;
};
volatile whatever test;
test.data 也会不稳定吗?

【问题讨论】:

  • 很好的问题。我读到拥有volatile 成员函数只会使this 指针易失性,因此每次访问成员时都会从内存中读取它们,但不是“正式”易失性。
  • 可能是a duplicate,但仍然是个好问题。

标签: c++


【解决方案1】:

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

创建结构const 是否使其所有成员const

如果我有:

struct whatever { int data; };

const whatever test;

test.data 也会是const 吗?

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

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

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


引用标准 ($7.1.5.1/8)

[注意:volatile 是 对 实施以避免激进 优化涉及对象 因为对象的值可能 通过无法检测到的方式被改变 执行。详见 1.9 语义。一般来说,语义 的易失性旨在成为 在 C++ 中与在 C 中相同。]

这意味着,如果您的对象是一个结构的实例,那么编译器就无法避免涉及该对象的积极优化除非它避免对每个对象进行积极优化成员。 (不然怎么避免涉及到对象的优化?)


相关话题:

Why do we use volatile keyword in C++?

【讨论】:

  • 重要的是要注意常量只传播给直接成员。如果您的结构包含指向某个对象的指针,则指针本身将是 const (例如,您将无法重新分配它),但您将能够更改指向的对象。 (假设您的结构没有隐藏指向 const 的指针)
【解决方案2】:

发件人: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;

【讨论】:

  • 不是问题的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
相关资源
最近更新 更多