优化易失变量
Optimizing volatile variables
我的理解是,访问易失性对象的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
确实如此(。
相关文章:
- 易失性sig_atomic_t的内存安全性
- 是否允许编译器优化掉局部易失性变量
- 优化易失变量
- 兼容的声明 __attribute__ ((节( ".abc.dfe" ))) 常量易失性 uint8 属性变量 = 0;- 符合MISRA标准
- 指向堆栈变量的指针是否易失
- 常量 & 指非易失性变量。变量将更改。更改是否使常量 & 无效?
- 如何使用 LLVM 传递使变量易失性或常量
- 优化易失性堆栈变量的存储/构造是否合法
- 海湾合作委员会 : __sync_lock_test_and_set VS.= 具有易失变量的运算符
- C++变量定义中的易失性类型量词位置
- 非易失性变量
- 在 C++ 中易变:我是否应该定义一个可能被几个线程更改的变量作为易失性
- 使用易失性布尔变量忙于等待
- 具有易失性原子变量的原子操作
- 如果我锁定变量,我是否必须将复杂类型标记为“易失性”?
- 为什么这个易失性变量的地址总是在1
- c++编译器能否消除未读的易失性局部变量?
- 在C中递增一个易失性变量
- GCC可以使用读-修改-写指令来更新易失性变量吗?
- 对 WinAPI 线程之间的共享变量使用易失性