stdatomic (C11),关于 _Atomic 类型的三个问题

Ale*_*Sim 2 c types atomic c11

第一个问题

我在 cppreference 上找到了

  • _Atomic ( type-name ) (自 C11 起)

    用作类型说明符;这指定了一个新的原子类型

  • _Atomic type-name (2)(自 C11 起)

    用作类型限定符;这指定类型名称的原子版本。在此角色中,它可以与 const、volatility 和 limit 混合使用),尽管与其他限定符不同,类型名称的原子版本可能具有不同的大小、对齐方式和对象表示形式。

那么使用_Atomic(int)而不是_Atomic int 保证它的大小相同int或不同吗?

第二个问题

在 Ex 中使用限定符_Atomic

_Atomic(volatile int)
Run Code Online (Sandbox Code Playgroud)

抛出错误,但像这样使用它:

_Atomic(volatile _Atomic(int)*)
Run Code Online (Sandbox Code Playgroud)

才不是; 这是标准行为吗?

最后一个问题

我注意到原子函数(例如:atomic_storeatomic_loadatomic_compare_exchange_weak)可以在传递的类型不为_Atomic类型的情况下工作,并且我仍然可以毫无问题地管理竞争条件。这是标准行为吗?它有缺点或导致任何错误吗?

Ant*_*ala 5

第一个问题:

C11 7.17.6p3

注意原子整数类型的表示不需要与其相应的常规类型具有相同的大小。它们应该尽可能具有相同的大小,因为这样可以减轻移植现有代码所需的工作量。

第二个问题:

C11 6.7.2.4p3

【限制条件】

3 原子类型说明符中的类型名称不得引用数组类型、函数类型、原子类型或限定类型。

volatile int是一个合格的类型。违反了约束部分中的“ shall”,因此编译器需要输出诊断消息。除此之外,这种构造的行为是未定义的。

第三个问题:

C11 7.17.1.p5

5 在以下概要中:

  • AnA指的是原子类型之一。

他们期待一种_Atomic类型。您传入一个非原子变量,因此未定义的行为。