【发布时间】:2020-03-24 17:35:53
【问题描述】:
由于今天是美国的感恩节,我将成为指定的火鸡来问这个问题:
拿些像这样无害的东西。具有简单普通旧数据类型(例如 int)的原子:
atomic<int> x;
cout << x;
上面将打印出垃圾(未定义)数据。考虑到我为atomic constuctor 阅读的内容,这是有道理的:
(1) 默认构造函数
使原子对象处于未初始化状态。 未初始化的原子对象稍后可能会通过调用 atomic_init 来初始化。
感觉像是一个奇怪的委员会决定。但我相信他们有他们的理由。但是我想不出另一个std:: 类,默认构造函数将使对象处于未定义状态。
我可以看到对于没有默认构造函数并且需要使用atomic_init 路径的std::atomic 使用更复杂的类型是多么有意义。但更一般的情况是在引用计数、顺序标识符值和基于简单轮询的锁定等场景中使用具有简单类型的原子。因此,这些类型没有自己的存储值“零初始化”(默认初始化)感觉很奇怪。或者至少,如果无法预测,为什么还要使用默认构造函数。
未初始化的std::atomic 实例有用的原因是什么。
【问题讨论】:
-
不,真正奇怪的是,
atomic<int> i{};也不会对它们进行零初始化。 -
默认的ctor需要建立一个类型的内部不变量。但是值初始化应该至少为复制建立一个有效状态,以便
T x = T();工作。但是复制原子并没有真正的意义,因为原子不是关于基本操作行为的值(并且复制不是原子操作)。 -
std::array
a;也使 a[0] 未初始化。
标签: c++ initialization language-lawyer stdatomic