对于这段简单的代码
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
,而标准不需要这样做。我无法在标准中找到对此的要求。
但是,这也可能是缺少优化的简单情况。