std::atomic_ref 需要对齐

问题描述 投票:0回答:1
根据

cppreference,硬件可能要求 atomic_ref<T>

 引用的对象比其他 
T
 对象具有更严格的对齐方式,并且对 
atomic_ref
 的操作是否无锁取决于参考对象。

为什么只需要

atomic_ref

 引用的对象具有正确的对齐方式,而 
std::atomic
 似乎没有强加这个要求?

c++ c++20 atomic memory-alignment stdatomic
1个回答
2
投票

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
 是编译器内部的。)

© www.soinside.com 2019 - 2024. All rights reserved.