gpt4 book ai didi

c++ - 原子 vector 的初始化

转载 作者:行者123 更新时间:2023-12-02 01:26:15 33 4
gpt4 key购买 nike

考虑:

void foo() {
std::vector<std::atomic<int>> foo(10);
...
}

foo 的内容现在有效吗?或者我是否需要显式循环并初始化它们?我检查过 Godbolt,看起来不错,但是标准在这一点上似乎很困惑。

std::vector构造函数说它插入 default-inserted std::atomic<int> 的实例,分别是value initialised通过安置new .

我认为值初始化的效果适用:

2) if T is a class type with a default constructor that is neither user-provided nor deleted (that is, it may be a class with an implicitly-defined or defaulted default constructor), the object is zero-initialized and then it is default-initialized if it has a non-trivial default constructor;

所以在我看来,原子是零初始化的。所以问题是, std::atomic<int> 的零初始化是否有效?结果是一个有效的对象?

我猜答案是“在实践中是的,但尚未真正定义”?

注:This answer同意它是零初始化的,但并没有真正说明这是否意味着该对象是有效的。

最佳答案

您的担心是正确的。根据标准,原子具有调用的默认构造函数,但是它们尚未这样初始化。这是因为默认构造函数不会初始化原子:

The default-initialized std::atomic<T> does not contain a T object, and its only valid uses are destruction and initialization by std::atomic_init

这在某种程度上违反了正常的语言规则,并且某些实现无论如何都会初始化(正如您所指出的)。

话虽这么说,我建议采取额外的步骤来确保它们 100% 根据标准正确初始化 - 毕竟您正在处理并发性,其中错误可能很难追踪。

有很多方法可以避免这个问题,包括使用包装器:

struct int_atomic {
std::atomic<int> atomic_{0};//use 'initializing' constructor
};

关于c++ - 原子 vector 的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58693053/

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