Jul*_*ina 3 c c++ port x86 gcc
假设您有x86系统代码的C代码,如下所示:
volatile uint32_t *reg = (volatile uint32_t *)0xCAFEBABE;
// ...
reg[0x10] |= 1;
Run Code Online (Sandbox Code Playgroud)
GCC可以在这里自由生成读 - 修改 - 写指令吗?如果是这样,将封装读取和写入函数中的volatile变量确保GCC不将访问组合到单个RMW指令中?
我知道C规范对此有意模糊.
C标准没有规定使用什么指令.对于像这样的简单更新,gcc最有可能生成单个RMW指令的风格
orl (%rdx), $1
Run Code Online (Sandbox Code Playgroud)
但volatile关键字与它无关.任何组合load, modify, store都会有效.该volatile关键字只告诉编译器重新加载每次使用的,而不是通过寄存器缓存的优化内存中的价值.
如果你想要一个原子更新然后你需要原子,gcc提供了这个 _sync_fetch_and_or(type *, type)
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |