繁体   English   中英

CMPXCHG16B 和 MSVC 的实现<atomic>不是默认的?</atomic>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM