首页 文章

GCC可以使用读 - 修改 - 写指令来更新volatile变量吗?

提问于
浏览
3

假设您有x86系统代码的C代码,如下所示:

volatile uint32_t *reg = (volatile uint32_t *)0xCAFEBABE;
// ...
reg[0x10] |= 1;

GCC可以在这里自由生成读 - 修改 - 写指令吗?如果是这样,将封装读取和写入函数中的volatile变量确保GCC不将访问组合到单个RMW指令中?

我知道C规范对此有意模糊 .

1 回答

  • 5

    C标准没有规定使用什么指令 . 对于像这样的简单更新 gcc 最有可能生成单个RMW指令的风格

    orl (%rdx), $1
    

    但是 volatile 关键字与它无关 . load, modify, store 的任何组合也都有效 . volatile 关键字仅告诉编译器在每次使用时从内存重新加载值,而不是使用寄存器缓存优化 .

    如果你想要一个原子更新然后你需要原子,gcc提供了这个 _sync_fetch_and_or(type *, type)

相关问题