为了回答这个问题,我们只考虑对
但我认为这有点太严格了。考虑两个变量的读取,它们之间没有任何副作用或者没有读取其他的volatile变量。现在我们知道,volatile变量中的值随时可能改变(编译器并不知情)。但程序员无法确保更改会发生在两次读取之间。这意味着,两次读取看到相同的值是程序的有效行为。
难道编译器不能强制执行这种行为吗?只做一次读取并使用两次值。
例如:
volatile
变量的读取。在我所阅读的所有讨论中,唯一的结论是:多次读取同一个声明为volatile的变量不能被优化为单个效果。但我认为这有点太严格了。考虑两个变量的读取,它们之间没有任何副作用或者没有读取其他的volatile变量。现在我们知道,volatile变量中的值随时可能改变(编译器并不知情)。但程序员无法确保更改会发生在两次读取之间。这意味着,两次读取看到相同的值是程序的有效行为。
难道编译器不能强制执行这种行为吗?只做一次读取并使用两次值。
例如:
int foo(volatile int * x) {
return *x + *x;
}
在这种情况下,编译器是否只进行一次读取操作呢?
我希望我的问题表达清楚了。
此外,我假设系统中读取本身没有副作用(如计数器的增量或值每次读取发生更改)。这样的系统存在吗?
我已经查看了gcc
和clang
生成的汇编代码,即使进行最大程度的优化,它们仍会插入两个读取操作。我的问题是它们是否过于保守?
编辑:为了不让我的问题变得复杂,并避免子表达式的实现定义顺序引起混淆,我们可以看以下示例 -
int foo(volatile int * x) {
int a = *x;
int b = *y;
return a + b;
}
但我也保留了之前的例子,因为一些答案和评论引用了它。
volatile
的变量在使用时将始终执行读取命令。即使使用了序列!就这样。故事结束。 - ringbuffer_peek