对于这段简单的代码
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 的优化器无法捕获和消除额外的栅栏的问题还是我遗漏了什么?
顺便说一句,clang 似乎可以处理相邻的栅栏。
最佳答案
是的,它不是,我已经和不同的人争论了一段时间。对于像我这样的外部观察者来说,效果是它将 atomic
视为 volatile
,而标准并不要求它。我在标准中找不到这方面的要求。
但是,这也可能是缺少优化的简单情况。
关于c++ - gcc 不合并连续的栅栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55620073/