clang vs gcc:不同的易失性访问代码

时间:2018-04-26 09:47:54

标签: c++ gcc assembly clang volatile

考虑这个例子:

$.magnificPopup.open({
    items: {
        src: '#modifyDialog',
        type: 'inline',
        focus: '#engTxtareaModify',
    },

    modal: true,
    fixedContentPos: true,
    callbacks: {
        open: function () {
            var html = "<button title='Close (Esc)' type='button' class='mfp-close'></button>";
            $('.modifyDialog').append(html);
        }
    }
})

当使用-Os编译时,clang-6.0在x64上为f和g生成相同的.mfp-close { color: #333; } 指令模式(参见https://godbolt.org/g/hUPprL),而gcc-7.3生成此指令(参见{{3}) })对于f():

volatile unsigned int x;
unsigned int y;

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

这只是一个错过的优化,还是有理由让gcc在易失性访问时拒绝shrl <offset>(%rip)?谁错了?

1 个答案:

答案 0 :(得分:4)

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

“在引擎盖下”操作内存操作数执行与更长实现相同的加载和存储。