Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMPXCHG16B和MSVC实现<;原子>;不是默认值吗?_C++_Visual C++_X86 64_Stdatomic_Compare And Swap - Fatal编程技术网

C++ CMPXCHG16B和MSVC实现<;原子>;不是默认值吗?

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

似乎要使用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 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
。(可以引入for
atomic_-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字节边界对齐