关于这个问题,我只对x86和x86-64感兴趣
对于MSVC 2005,__ faststorefence的文档说:“保证每个前面的商店在任何后续的商店之前全局可见。”
对于MSVC 2008和2010,它更改为:“保证每个先前的内存引用,包括加载和存储内存引用,在任何后续内存引用。“的
写入后者的方式,我认为这也会阻止CPU在旧商店之前重新排序负载。这与第一个定义不同,后者暗示内在函数仅用于处理对旧商店的非临时存储的阻塞或重新排序(唯一的其他重新排序x86(-64)确实如此)。
然而,文档似乎自相矛盾:“在x64平台上,此例程生成的指令比 sfence 更快商店围栏 >指令。在x64平台上使用此内在而不是_mm_sfence。“
这意味着它仍然具有类似sfence的功能,因此仍然可以使用较旧的存储重新排序负载。那是哪个呢?有人可以解决我的困惑吗?
PS:寻找这个函数的GCC版本,我遇到long local; __asm__ __volatile__("lock; orl $0, %0;" : : "m"(local));
,但我认为它来自32位代码;什么是64位模拟?
答案 0 :(得分:2)
您引用的GCC版本等同于MSVC生成的代码。它依赖于x86 / x86-64处理器体系结构文档指定加载和存储不使用LOCK
ed指令重新排序的事实。
我不清楚这是否适用于非临时存储,因为通常内存模型限制不适用于这些指令。