gpt4 book ai didi

c++ - 原子的 0 初始化是否保证将值成员设置为 0?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:31 25 4
gpt4 key购买 nike

std::atomic<integral_type>的0-初始化是什么意思?变量均值?

问题的来源。我有一个静态函数 std::arraystd::atomic<std::int> ,我想在第一次使用之前将其设置为 0(不用说,数组所在的函数从多个线程以不可预测的方式调用)。

这段代码看起来不错,但由于原子是不可复制构造的,所以无法编译:

#include <array>
#include <atomic>

void foo() {
using t = std::atomic<int>;
static std::array<t, 2> arr = {0, 0}; // <-- explicit, but errors out (see below)
static std::array<t, 2> arr2; // <-- implicit?, works
}

error: use of deleted function ‘std::atomic::atomic(const std::atomic&)’ std::array arr = {0, 0};

现在,我明白静态 std::array将对其所有成员进行 0 初始化,并且 std::atomic<>将被0初始化。但是我们是否有明确或隐含的保证,它实际上会将所有 values 设置为 0?常识说"is"——毕竟,我们假设该类将有一个 int 类型的成员。 ,并且这个成员将被0初始化。但该假设是否基于坚实的标准基础?

最佳答案

使用(通常是多余的)大括号来避免复制初始化:

static t arr[2] = {{0}, {0}};
static std::array<t, 2> arr2 = {{{0}, {0}}}; /* Need extra pair here; otherwise {0} is
treated as the initializer of the internal
array */

Demo .当省略大括号时,我们正在复制初始化,这需要创建一个临时文件并从中复制。通过大括号,我们进行了复制列表初始化,其作用与直接列表初始化相同(即使用 {0} 初始化每个元素,这很好)。

您也可以等到 guaranteed copy elision已引入,只需使用您的语法即可。

关于c++ - 原子的 0 初始化是否保证将值成员设置为 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36337937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com