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>的指令可以使所有代码在谢谢 您没有任何其他代码。在真空中,它并没有耗尽所有的能量-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