cppreference,硬件可能要求 atomic_ref<T>
引用的对象比其他
T
对象具有更严格的对齐方式,并且对
atomic_ref
的操作是否无锁取决于参考对象。为什么只需要
atomic_ref
引用的对象具有正确的对齐方式,而
std::atomic
似乎没有强加这个要求?
std::atomic
将
T
对象分配为类成员,因此其内部可以应用足够的对齐方式。将
atomic<T>*
指向现有的
T
对象的定义并不明确,尽管在许多实现中它恰好可以工作。这就是
std::atomic_ref<T>
旨在解决的问题;对单独存在的普通
T
对象进行原子访问,您可能会在程序的其他阶段对其进行一些非原子访问。在 C++20 之前,标准根本没有提供这样做的方法;这就是为什么如果你想使用
T
,你自己对齐一个普通
atomic_ref
对象的程序员可见的要求在 C++20 中是新的,比如
alignas(std::atomic_ref<T>::required_alignment) T foo;
std::atomic_ref<T>::required_alignment
将等于
alignof(std::atomic<T>)
,即使
alignof(T)
更低。至少在正常的实施中。
std::atomic_ref
,您当然可以使用特定于编译器的扩展,例如 GNU C
__atomic
内置在普通对象上。这就是
std::atomic<T>
和
std::atomic_ref<T>
在 GCC / clang 标头中的实现方式,而不是像 C11
_Atomic
关键字那样在编译器中直接支持。 (它必须自己对其应用的事物进行过度对齐。有一段时间有GCC错误65146
_Atomic
没有强制
int64_t
对齐,即使在32位目标上也是如此只有 4 字节对齐,例如 x86;它在结构外部工作,因为 GCC 选择对齐
int64_t
以提高性能,但实际上在结构内部并不是原子的。G++ 的
std::atomic<>
早些时候在
<atomic>
标头中修复了该错误,但是 C
_Atomic
是编译器内部的。)