优化volatile变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优化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存储怎么办?

答案

as-if rule下,......

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

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

- 通过volatile glvalues的访问严格根据抽象机器的规则进行评估。

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

以上是关于优化volatile变量的主要内容,如果未能解决你的问题,请参考以下文章

优化volatile变量

volatile关键字

volatile

volatile用法

C++ volatile关键字

Volatil用法