【发布时间】:2021-02-10 07:24:42
【问题描述】:
对 volatile 变量的写入在某种程度上是 C++ 中的副作用,通常无法在 as-if 规则下进行优化。在实践中,这通常意味着在检查程序集时,您会看到抽象机器为每个易失性存储提供一个存储1。
但是,我不清楚是否必须在以下情况下执行存储,即底层对象不是易失性的,但存储是通过指向易失性的指针完成的:
void vtest() {
int buf[1];
volatile int * vptr = buf;
*vptr = 0;
*vptr = 1;
*vptr = 2;
}
在这里,gcc does in fact 优化所有的商店。 Clang 没有。奇怪的是,行为取决于缓冲区大小:buf[3] gcc 会发出存储,但buf[4] 不会,依此类推。
gcc 在这里的行为合法吗?
[1] 有一些小的变化,例如,一些编译器将在 x86 上使用单个读取-修改-写入指令来实现类似 v++ 的东西,其中 v 是易失性的)。
【问题讨论】:
-
我建议在一些GCC mailing list上问同样的问题
-
@BasileStarynkevitch - 嗯this 似乎回答了这个问题(至少在新文本的标准中):重要的是用于访问的指针的限定,而不是底层的定义对象。
-
在当前草案中,this sentence 似乎是相关的:通过 volatile glvalue 访问的语义是实现定义的。
标签: c++ language-lawyer volatile