C++11 x86(-64)上std::memory_order_*的效果/完全填充

C++11 x86(-64)上std::memory_order_*的效果/完全填充,c++11,x86,x86-64,intel,memory-barriers,C++11,X86,X86 64,Intel,Memory Barriers,我有以下代码: #include <cstdint> #include <atomic> void myAtomicStore(std::atomic<int32_t>& i, const int32_t v) { i.store(v, std::memory_order_release); } int myAtomicLoad(std::atomic<int32_t>& i, const int32_t v) {

我有以下代码:

#include <cstdint>
#include <atomic>

void myAtomicStore(std::atomic<int32_t>& i, const int32_t v) {
    i.store(v, std::memory_order_release);
}

int myAtomicLoad(std::atomic<int32_t>& i, const int32_t v) {
    return i.load(std::memory_order_acquire);
}
#包括
#包括)GCC 8.1将其(对于x86_64)转换为:

myAtomicStore(std::atomic&,int): mov DWORD PTR[rdi],esi ret myAtomicLoad(std::atomic&,int): mov eax,DWORD PTR[rdi] ret
< >我想知道<代码> MOV < /C>的指令可以使所有代码在 MyAcMICStule]()/>代码之前对另一个线程在相同的变量(或内存位置)调用<代码> MyAcimoLoad()/< >时——对C++的标准保证。 我略读了一遍;我看不到任何明显的东西


谢谢

您没有任何其他代码。在真空中,它并没有耗尽所有的能量-order@Caleth:这不是原因(除了vs.编译时重新排序)。释放存储也应用于调用函数中的存储。原因是x86的强内存模型使每个存储都成为发布存储,每个加载都成为获取加载,因此编译器不需要任何额外的指令。另见(.查找重复的Q&a;IIRC部分引用了手册中的英特尔内存排序规则。可能重复的顶级答案引用了英特尔SDM第8.2.2节,其中内存排序规则禁止除StoreLoad之外的所有重新排序。另请参见x86标记wiki中的、和以及内存排序链接:@PeterCordes感谢E链接。我想我明白了。x86不允许CPU重新排序写入(在上一个例子中有一些例外);因此,一系列简单的<代码> MOV 已经“实现”了C++标准中提到的保证。谢谢!
myAtomicStore(std::atomic<int>&, int):
        mov     DWORD PTR [rdi], esi
        ret
myAtomicLoad(std::atomic<int>&, int):
        mov     eax, DWORD PTR [rdi]
        ret