我的理解是C ++标准要求严格根据抽象机器的规则来评估对易失性对象的访问。我确信这意味着不能更改给定volatile变量的加载和存储数量,也不能重新排序这些访问。
但是关于其他非易失性访问的重新排序呢?
if语句的两个臂中的完全冗余易失性访问是否可以被提升或者退出?例如。假设不会违反任何数据依赖性
if (e) {
= non-volatile-load;
non-volatile-store =;
t = volatile-load;
= non-volatile-load;
non-volatile-store =;
} else {
= non-volatile-load;
non-volatile-store =;
t = volatile-load;
= non-volatile-load;
non-volatile-store =;
}
优化到
t = volatile-load;
if (e) {
= non-volatile-load;
non-volatile-store =;
= non-volatile-load;
non-volatile-store =;
} else {
= non-volatile-load;
non-volatile-store =;
= non-volatile-load;
non-volatile-store =;
}
或
if (e) {
= non-volatile-load;
non-volatile-store =;
= non-volatile-load;
non-volatile-store =;
} else {
= non-volatile-load;
non-volatile-store =;
= non-volatile-load;
non-volatile-store =;
}
t = volatile-load;
如果volatile-load是volatile存储怎么办?
答案 0 :(得分:1)
在as-if rule下,...
...符合实现......需要模拟(仅)抽象机器的可观察行为,如下所述
observable behavior在下面指定为(强调我的)......
- 严格按照抽象机的规则评估
volatile
glvalues的访问。
所以是的,编译器可能会重新排序对非易失性变量的访问(当然在线程环境中的内存栅栏边界内; volatile
不提供这样的语义,atomic
会这样做。