优化 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
提供).
我的理解是,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
提供).