C++:为什么volatile访问需要排序
C++: Why does volatile access needs sequencing?
我在C++测试网站上浏览了下面的代码。它还提供了一个解释。我知道volatile
限定符向编译器发出信号,表示变量的值可能会因其他因素而更改。该网站的解释补充说,访问volatile
应该按顺序排列。为什么以及如何对其进行测序?
我不明白无序列副作用和标量对象是什么意思。也请说明清楚。
#include <iostream>
volatile int a;
int main() {
std::cout << (a + a);
}
这里的问题不是缺少变量
a
的初始值设定项,而是将在此处隐式初始化为0。但问题是访问到a两次,而不在访问之间排序。根据§1.9¶12,volatile
glvalues的访问是副作用,根据到§1.9¶15这两个未排序的副作用在同一标量上对象导致未定义的行为。
这里没有定义两个访问中的哪一个先发生。
在这种对称加法运算的情况下,这并不重要。
但考虑一个不同的非对称操作:
std::cout << a * (a+1);
现在,考虑一个volatile
对象,由于外部因素,它在每次访问后都会自动递增。比方说,a
是某种硬件寄存器。正如我所说,假设每次访问它时,它都会递增,所以硬件寄存器在第一次访问时包含值4,在第二次访问时则包含值5。一个简单的计数器。
然后,如果第一次访问用于乘法的左手侧,而第二次访问用于对乘法的右手侧访问的加法运算,则这变为
std::cout << 4 * (5+1);
但是,如果第一次访问是针对右手侧,而第二次访问则是针对左手侧,则这将成为
std::cout << 5 * (4+1);
这就是为什么仅仅拥有volatile
对象是不够的。操作必须按顺序进行。
相关文章:
- 通过方法访问结构
- 二叉排序树无法编译
- 排序查询如何访问私有向量值
- 计数排序输出问题:读取访问冲突
- C STD ::排序Intel编译器错误:访问违规
- 使用原子指令确保映射访问安全,是否可以使用两个不同的原子对指令进行重新排序
- 用于访问集合c++的排序子集的数据结构
- C++:为什么volatile访问需要排序
- 错误的线程访问/seg故障快速排序
- 如何优化间接基数排序?(又名如何优化不可预测的内存访问模式)
- 对共享数据的线程安全访问 - 读/写实际发生,不会发生重新排序
- "std::"具有排序/排序、存在测试和头/尾访问的数据结构?
- c++是否有一个默认的数据类,用于以合理的速度对基于索引的访问进行排序
- C++:未排序的修改和对"i"的访问
- 使用可以访问类成员的compare函子对std::vector进行排序
- 在从算法stl c++进行排序时访问未分配的内存
- as-if规则是否防止编译器对全局/成员变量的访问重新排序
- 归并排序c++实现脱界索引访问
- 在合并排序中出现严重的访问错误
- 可以对易失物的访问重新排序