Для этого простого куска кода
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 не может поймать и устранить лишние ограждения или я что-то упустил?
Кстати, лязг, кажется, обрабатывает смежные заборы.