c++ - clang 与 gcc : different code for volatile access

标签 c++ gcc assembly clang volatile

考虑这个例子:

volatile unsigned int x;
unsigned int y;

void f() {
    x /= 2;
}
void g() {
    y /= 2;
}

当使用 -Os 编译时,clang-6.0 在 x64 上为 f 和 g 生成相同的 shrl <offset>(%rip)指令模式(见 https://godbolt.org/g/hUPprL ),而 gcc-7.3 为 f() 生成这个(见 https://godbolt.org/g/vMcKVV ):

 mov 0x200b67(%rip),%eax # 601034 <x>
 shr %eax
 mov %eax,0x200b5f(%rip) # 601034 <x>

这只是一个错过的优化,还是 gcc 拒绝 shrl <offset>(%rip) 的理由?如果访问不稳定?谁错了?

最佳答案

这只是 gcc 遗漏的优化。两种实现都精确地保留了对 x 的读取和写入,因此都是正确的。

对内存操作数的“底层”操作执行与较长实现相同的加载和存储。

关于c++ - clang 与 gcc : different code for volatile access,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50039867/

相关文章:

c++ - 在以下情况下函数重载如何工作?

gcc - 对 YAML::Load 的 undefined reference

gcc - 如何在 CentOS 7.2 上使用 yum 安装 gcc 5.3?

c - 字符串在栈上的分配

c++ - 为什么T 'skips'的模板参数推导是数组元素的const,而函数参数是对T的const引用?

c++ - Cpp : JSON parser in Cpp that provide support Serialize/Deserialize feature, 将 JSON 对象转换为用户定义的类?

c++ - 请求从 ‘std::vector<AdjacencyData> (*)()’ 到非标量类型 ‘std::vector<AdjacencyData>’ 的转换

c++ - dlopen 是否重新加载已经加载的依赖项?如果是这样,有什么影响?

unicode - 如何将 UTF-16 转换为 ASCII

assembly - 错误 a2070 指令操作数无效