[英]CMPXCHG16B and MSVC Implementation of <atomic> not the default?
似乎要使用 CMPXCHG16B,必须定义 _STD_ATOMIC_ALWAYS_USE_CMPXCHG16B = 1 以便使用这些指令。
为什么这是默认值? 除非我阅读整个 atomic.h header,否则我永远不会发现这一点。
STL 中还有哪些其他全局定义? 是否有一份清单可供审查,以便人们能够可靠地了解这些实施细节?
_STD_ATOMIC_ALWAYS_USE_CMPXCHG16B
最近在 Visual Studio 2019( PR )中引入
Visual Studio 2019 仍然支持旧操作系统,例如 Windows Vista 和 Windows 7。这些操作系统可以在没有此指令的旧 AMD Opteron CPU 上运行。
即使_STD_ATOMIC_ALWAYS_USE_CMPXCHG16B = 0
,运行时检测也会使用CMPXCHG16B
如果可用)。 但是在这种情况下,指令不是内联的,并且还有一个分支,因此它的效率低于定义_STD_ATOMIC_ALWAYS_USE_CMPXCHG16B = 1
。
另请注意, CMPXCHG16B
用于atomic_ref
,但由于 ABI 兼容性而不用于atomic
。 (可以引入atomic_ref
,因为没有 C++20 之前的atomic_ref
与 ABI 兼容)。
在vNext
版本(下一个主要版本,ABI 破坏版本)中, atomic
也应该使用CMPXCHG16B
。 也有希望放弃对旧 CPU/操作系统的支持,并且CMPXCHG16B
的使用将成为无条件的。 (参见https://github.com/microsoft/STL/issues/1151 )。
除非我阅读整个 atomic.h header,否则我永远不会发现这一点。
STL 中还有哪些其他全局定义? 是否有一份清单可供审查,以便人们能够可靠地了解这些实施细节?
恐怕没有完整的清单,尽管有一些记录在案。
特别是_STD_ATOMIC_ALWAYS_USE_CMPXCHG16B
的借口可能是整个atomic_ref
没有记录,并且作为 C++20 功能,它在 Visual Studio 2019 中具有实验状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.