如何优雅地初始化std :: atomic数组?

时间:2014-06-19 03:32:01

标签: c++ c++11

假设我有一个成员数组为std::atomic s的类,其中 数组通过计算确定大小(即它可能会根据程序中其他地方的其他常数而改变):

class Foo {
  static constexpr size_t kArraySize = ComputeArraySize();
  std::atomic<size_t> atomics_[kArraySize];
};

确保原子都被初始化为最优雅的方法是什么? 零?我可以做的比在Foo的构造函数中循环数组更好 明确存储零? std::array答案是否有所不同?

通常我会在这里使用一个大括号初始化器,但是派生的长度(哪个 可能很长)使其变得困难。

请注意,我不能假设Foo的实例具有静态存储 持续时间。

1 个答案:

答案 0 :(得分:11)

好的,我相信我已经完成了这项工作。这两个都将初始化所有 原子论为零:

std::atomic<size_t> plain_array[kArraySize] = {};
std::array<std::atomic<size_t>, kArraySize> std_array = {};

这是逻辑:

  • [dcl.init.aggr] / 1将数组定义为聚合。

  • [array.cons] / 1强制要求std::array也是聚合。

  • [dcl.init.aggr] / 7表示如果初始化程序的元素较少 列表比聚合中的成员,然后是其余成员 应从空的初始化列表初始化。在这种情况下,那是 所有成员。

  • [dcl.init.list] / 3定义了一个类的空列表中的列表初始化 使用默认构造函数(与std::atomic一样)来导致 值初始化。

  • [dcl.init] / 7表示没有用户提供的构造函数的类是 零初始化。假设std::array<T>包含T数组, 并且std::atomic<size_t>的零表示符合我们的预期, 那我们很好。

现在,std::atomic 确实拥有一个用户提供的构造函数,而不是一个 用户提供的默认构造函数(后者明确默认)。所以 它在技术上不符合最后一点的条件。但似乎这样 标准中为error,最近为fixed 草稿。