优化 volatile 变量

Optimizing volatile variables

我的理解是,C++ 标准要求对易失性对象的访问严格按照抽象机的规则进行评估。我确信这意味着无法更改给定 volatile 变量的加载和存储次数,也无法重新排序这些访问。

但是关于其他非易失性访问的重新排序呢?

if 语句的两个分支中的完全冗余的易失性访问是否可以从 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;

如果易失性负载是易失性存储会怎样?

as-if rule,...

... conforming implementations ... are required to emulate (only) the observable behavior of the abstract machine as explained below

并且 observable behavior 在下面指定为(强调我的)...

– Accesses through volatile glvalues are evaluated strictly according to the rules of the abstract machine.

所以是的,编译器可能会重新排序对 non-volatile 变量的访问(当然在线程环境中的内存栅栏边界内;volatile 不提供这种语义,atomic 提供).