Nor*_*ame 7 c++ assembly gcc volatile clang
考虑这个例子:
volatile unsigned int x;
unsigned int y;
void f() {
x /= 2;
}
void g() {
y /= 2;
}
Run Code Online (Sandbox Code Playgroud)
当使用-Os编译时,clang-6.0在x64上为f和g生成相同的shrl <offset>(%rip)指令模式(参见https://godbolt.org/g/hUPprL),而gcc-7.3生成此参数(请参阅https:// godbolt. org/g/vMcKVV)对于f():
mov 0x200b67(%rip),%eax # 601034 <x>
shr %eax
mov %eax,0x200b5f(%rip) # 601034 <x>
Run Code Online (Sandbox Code Playgroud)
这只是一个错过的优化,还是有理由让gcc shrl <offset>(%rip)在易失性访问时拒绝?谁错了?
这只是 gcc 错过的优化。两种实现都精确地保留了读取和写入x,因此都是正确的。
对内存操作数进行“幕后操作”执行与较长实现相同的加载和存储。