对于这段简单的代码

std::atomic_int i;
void foo() {
    i.store(1);
    i.store(2);
}

gcc为ARM生成以下程序集:
movw    r3, #:lower16:.LANCHOR0
movt    r3, #:upper16:.LANCHOR0
dmb ish
mov r1, #1
mov r2, #2
str r1, [r3]
dmb ish
dmb ish               ; why is this not eliminated?
str r2, [r3]
dmb ish
bx  lr

您可能会注意到中间出现了重复的栅栏,这似乎是多余的。是gcc的优化器无法捕获和消除多余的栅栏的问题,还是我丢失了某些东西?

顺便说一句,c似乎可以处理相邻的围栏。

最佳答案

是的,事实并非如此,而且我已经与各种人辩论了一段时间。对于像我这样的外部观察者来说,效果是它将atomic视为volatile,而标准不需要这样做。我无法在标准中找到对此的要求。

但是,这也可能是缺少优化的简单情况。

07-26 09:35