优化易失变量

Optimizing volatile variables

本文关键字:变量 易失 优化      更新时间:2023-10-16

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

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

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 规则下,...

。符合实现...需要模拟(仅(抽象机器的可观察行为,如下所述

可观察的行为在下面指定为(强调我的(...

– 通过volatile glvalues 进行的访问严格按照抽象机器的规则进行评估。

所以是的,编译器可以对非易失性变量的访问重新排序(当然在线程环境中的内存围栏边界内; volatile没有提供这样的语义,atomic确实如此(。