【发布时间】:2018-07-23 12:19:28
【问题描述】:
标准在哪里定义了 volatile 变量可以更改 未被发现?
我发现了两个关于 volatile 的规范性文本:
读取由 volatile glvalue ([basic.lval]) 指定的对象、修改对象、调用库 I/O 函数或调用执行任何这些操作的函数都是副作用,即执行环境状态的变化。表达式(或子表达式)的评估通常包括值计算(包括确定对象的身份以进行右值评估和获取先前分配给对象以进行纯右值评估的值)和副作用的启动。当对库 I/O 函数的调用返回或评估通过 volatile 左值的访问时,副作用被认为是完整的,即使调用(例如 I/O 本身)或 volatile 访问隐含的一些外部操作可能还没有完成。
这一段是关于未检测到的变化吗? 副作用是这个意思吗?
或者有dcl.type.cv/5:
通过 volatile 左值访问的语义是实现定义的。如果尝试通过使用非易失性泛左值访问使用 volatile 限定类型定义的对象,则行为未定义。
这一段是关于我的问题吗? “通过 volatile glvalue 访问的语义是实现定义的”到底是什么意思?你能举一个不同的“访问语义”的例子吗?
还有dcl.type.cv/6,这是关于我的问题,但它只是一个注释:
[ 注意: volatile 是对实现的提示,以避免涉及对象的激进优化,因为对象的值可能会通过实现无法检测的方式进行更改。此外,对于某些实现,易失性可能表示需要特殊的硬件指令才能访问该对象。有关详细语义,请参见 [intro.execution]。一般来说,volatile 的语义在 C++ 中与在 C 中的语义相同。— 尾注 ]
【问题讨论】:
-
您只是出于好奇而问吗?还是有一些潜在的原因?如果是后者,您遇到的real 和actual 问题是什么?也许你应该更直接地问这个问题?
-
@Someprogrammerdude:我想对我自己以前的question 给出一个答案,我想更好地理解这个问题。所以没有真正的底层编程问题,但出于好奇,为了更好地理解易失性:易失性变量如何以及何时可以“未被发现”的变化。
-
我很确定这个问题和上一个问题已经在 SO 上进行了广泛讨论。
-
“通过 volatile glvalue 访问的语义是实现定义的”非常不清楚。但我认为应该阅读有关“本文档中的语义描述定义参数化的非确定性抽象机器”。因此,我认为读取一个 volatile 变量可以改变任何事情。甚至非易失变量的值。只要行为被准确记录。
-
This 可能是相关的。
标签: c++ language-lawyer c++17 volatile