Код: Выделить всё
// file: inc.cc
int inc_value(int* x) {
(*x)++;
//std::atomic ww;
//ww.load(std::memory_order_relaxed);
(*x)++;
return *x;
}
Код: Выделить всё
g++ -S inc.cc -o inc.s -O3
addl $2, %eax
Код: Выделить всё
addl $1, (%rdi)
movl -4(%rsp), %eax
movl (%rdi), %eax
addl $1, %eax
movl %eax, (%rdi)
Я знал:
- cppreference говорит, что нет гарантии порядка в памяти вокруг расслабленной работы, так что для компилятора это нормально изменить порядок
- X86-64 имеет надежную модель памяти TSO; Атомарные операции не генерируют инструкции lock/xchg/mfence cpu-fence, а работают только как ограждение компилятора (за исключением seq_cst);
- для x86-64, всегда ли GCC генерирует полную защиту компилятора для атомарных операций? даже несмотря на то, что это спокойная операция; Кроме того, GCC генерирует команду mov-to-memory вместо инструкции mov-to-register (не кэширует значение tmp в регистре), подразумевает ли «атомный-компилятор-забор» также побочный эффект памяти для GCC, поэтому GCC должен хранить/загружать значения из памяти вокруг забора?
- Если да, то для x86-64 достаточно ли использовать только 2 порядка: Relaxed-order и seq_cst? Поскольку x86-64 имеет гарантии TSO, а расслабленный порядок рассматривается как полная защита компилятора, он может заменить использование Release/Acquire/Consume.
Подробнее здесь: https://stackoverflow.com/questions/793 ... iler-fence