Gcc始终生成mfence.为什么?

5 gcc memory-barriers c++11

我想知道为什么GCC 6.2生成以下程序集输出:

main:
    push    rbp
    mov     rbp, rsp
    mov     DWORD PTR [rbp-12], 0
    mfence
    mov     DWORD PTR [rbp-8], 3
    mfence
    mov     DWORD PTR [rbp-4], 2
    mfence
    mov     eax, 0
    pop     rbp
    ret
Run Code Online (Sandbox Code Playgroud)

来自:

#include <atomic>

int main(){

 std::atomic_thread_fence(std::memory_order_relaxed); // why mfence instead of `nothing`?
 std::atomic_thread_fence(std::memory_order_release); // why mfence instead of sfence?
 std::atomic_thread_fence(std::memory_order_acquire); // why mfence instead of lfence?


  return 0;
}
Run Code Online (Sandbox Code Playgroud)

特别:

  1. 为什么mfence而不是nothing
  2. 为什么mfence而不是sfence
  3. 为什么mfence而不是lfence