优化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变量的主要内容,如果未能解决你的问题,请参考以下文章