优化volatile变量

时间:2018-03-06 20:41:40

标签: c++ optimization volatile

我的理解是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存储怎么办?

1 个答案:

答案 0 :(得分:1)

as-if rule下,...

  

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

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

  

- 严格按照抽象机的规则评估volatile glvalues的访问。

所以是的,编译器可能会重新排序对非易失性变量的访问(当然在线程环境中的内存栅栏边界内; volatile不提供这样的语义,atomic会这样做。