C++ CMPXCHG16B和MSVC实现<;原子>;不是默认值吗?
似乎要使用CMPXCHG16B,必须定义_STD_ATOMIC_ALWAYS_USE_CMPXCHG16B=1 以便使用这些说明 为什么这是默认值?除非我阅读整个atomic.h标题,否则我永远也不会发现这一点C++ CMPXCHG16B和MSVC实现<;原子>;不是默认值吗?,c++,visual-c++,x86-64,stdatomic,compare-and-swap,C++,Visual C++,X86 64,Stdatomic,Compare And Swap,似乎要使用CMPXCHG16B,必须定义_STD_ATOMIC_ALWAYS_USE_CMPXCHG16B=1 以便使用这些说明 为什么这是默认值?除非我阅读整个atomic.h标题,否则我永远也不会发现这一点 STL中还有哪些其他全局定义?是否有一个列表可供查看,以便可靠地了解这些实施细节?\u STD\u ATOMIC\u ALWAYS\u CMPXCHG16B最近在Visual Studio 2019中引入 Visual Studio 2019仍然支持较旧的操作系统,如Windows Vi
STL中还有哪些其他全局定义?是否有一个列表可供查看,以便可靠地了解这些实施细节?
\u STD\u ATOMIC\u ALWAYS\u CMPXCHG16B
最近在Visual Studio 2019中引入
Visual Studio 2019仍然支持较旧的操作系统,如Windows Vista和Windows 7。这些操作系统可以在没有此指令的旧AMD Opteron CPU上运行
即使\u STD\u ATOMIC\u始终使用\u CMPXCHG16B=0
,如果可用,运行时检测也会使用CMPXCHG16B
。但在这种情况下,指令不是内联的,还有一个分支,因此它的效率低于定义\u STD\u ATOMIC\u ALWAYS\u USE\u CMPXCHG16B=1
还请注意,CMPXCHG16B
用于atomic_ref
,但由于ABI兼容性,不用于atomic
。(可以引入foratomic_-ref
,因为没有与ABI兼容的C++20之前的atomic_-ref
)
在vNext
版本(下一个主要的ABI破坏版本)中,atomic
也应该使用CMPXCHG16B
。人们还希望旧的CPU/OS支持将被放弃,使用CMPXCHG16B
将成为无条件的。(见附件)
除非我阅读整个atomic.h标题,否则我永远也不会发现这一点
STL中还有哪些其他全局定义?是否有清单可供审查,以便可靠地了解这些实施细节
恐怕没有全面的清单,尽管有些是有文件记录的
\u STD\u ATOMIC\u ALWAYS\u使用CMPXCHG16B
的理由尤其可能是整个ATOMIC\u ref
没有文档记录,而且作为C++20功能,它在Visual Studio 2019中处于实验状态。您正在查看的ATOMIC
的哪个版本?在我的VC++2019\u STD\u ATOMIC\u ALWAYS\u USE\u CMPXCHG16B
仅出现在\if 0
块中。请注意,这样做与使用ATOMIC
的其他代码不兼容。所有接触对象的代码都需要同意是否使用单独的锁。使用msvc 16.8.2,它不在#if 0的内部block@J.Tully有趣。它仍然在16.7.5版本中的#if 0//TRANSITION,ABI
块中,这是VS 2019版本。答案很好!我将CMPXCHG16B用于uu m128和u m128i数据类型。__m128的原子比较交换特别有用。但是,性能只是使用单个原子整数的代码的一小部分。__m128自然与16字节对齐,对吗?请参见关于对齐的回答:_m128类型的变量自动与16字节边界对齐