我在C++测验网站上浏览了下面的代码.它还提供了解释.我知道volatile限定符向编译器发出信号,表明变量的值可能会被其他一些因素改变.该网站的解释补充说,volatile应该对访问进行排序.为什么以及如何排序?
我不明白他们的意思是无序的副作用和标量对象.还请说清楚.
#include <iostream>
volatile int a;
int main() {
std::cout << (a + a);
}
Run Code Online (Sandbox Code Playgroud)
这里的问题不是缺少变量的初始值设定项
a- 它将在这里隐式初始化为0.但问题是在访问之间没有排序的情况下访问两次.根据§1.912,glvalues的访问volatile是副作用,根据§1.915,这两个对同一标量对象的未测序副作用会导致未定义的行为.
这里没有定义两个访问中的哪一个首先出现.
在这种对称加法运算的情况下,它并不重要.
但考虑一个不对称的不同操作:
std::cout << a * (a+1);
Run Code Online (Sandbox Code Playgroud)
现在,考虑一个volatile对象,由于外部因素,每次访问后都会自动递增.例如,假设a是某种硬件寄存器.正如我所说,让我们说每次访问它都会增加,因此硬件寄存器在第一次访问时包含值4,在第二次访问时包含5.一个简单的柜台.
然后,如果第一次访问是乘法的左侧,第二次访问是乘法右侧访问的加法运算,那么这就变成了
std::cout << 4 * (5+1);
Run Code Online (Sandbox Code Playgroud)
但是,如果第一次访问是针对右侧,第二次访问是针对左侧,则会变为
std::cout << 5 * (4+1);
Run Code Online (Sandbox Code Playgroud)
这就是为什么有volatile对象是不够的.必须对操作进行排序.
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |