GCC可以使用读-修改-写指令来更新易失性变量吗?
Can GCC use read-modify-write instructions to update volatile variables?
假设您有用于x86系统的C代码,如下:
volatile uint32_t *reg = (volatile uint32_t *)0xCAFEBABE;
// ...
reg[0x10] |= 1;
GCC可以自由地在这里生成读-修改-写指令吗?如果是这样,在函数中封装对volatile变量的读写操作是否可以确保GCC不会将这些访问合并到单个RMW指令中?
C标准没有指定要使用什么指令。对于这样一个简单的更新,gcc
最有可能生成一个样式为
orl (%rdx), $1
volatile
关键字与此无关。load, modify, store
的任意组合也是有效的。volatile
关键字只告诉编译器在每次使用时从内存中重新加载值,而不是使用寄存器缓存优化。
如果你想要一个原子更新,那么你需要原子,gcc提供了这个_sync_fetch_and_or(type *, type)
相关文章:
- 易失性sig_atomic_t的内存安全性
- C++易失性:保证 32 位访问?
- 避免易失性和非易失性成员函数的代码重复
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 如何访问常量易失性 std::array?
- 为什么在 C++20 中弃用易失性?
- 根据 MSVC,具有易失性成员的结构不再是 POD
- 是否允许编译器优化掉局部易失性变量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 如何避免对无锁程序使用易失性?
- C++:易失性实例中的易失性成员函数 - 将数组分配给指针是无效的转换?
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- 是什么让这种易失性打破了结构的指针算法?
- 如果不需要易失性,为什么 std::atomic 方法会提供易失性重载
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 使用易失性 c 字符串和 std::cout
- 易失性结构 = 结构不可能,为什么?
- 如何强制 GCC 以线性方式转换易失性内联程序集语句
- 我可以使用互斥锁或关键字(静态)代替C++中的易失性吗?
- GCC可以使用读-修改-写指令来更新易失性变量吗?