【问题标题】:Is a zero initialized std::atomic<T*> guaranteed equivalent to one initialized with nullptr?零初始化的 std::atomic<T*> 是否保证等同于用 nullptr 初始化的一个?
【发布时间】:2016-07-30 19:52:34
【问题描述】:

给定foo.cpp:

#include <atomic>

namespace {
    std::atomic<int*> gets_zero_init;
    std::atomic<int*> gets_nullptr{nullptr};
}

我确信gets_zero_init 是零初始化的,并且它的初始化在零初始化后完成。我也有信心gets_nullptr 最终会被nullptr 初始化,我也相当有信心gets_nullptr 的初始化在零初始化后没有完成,因为std::is_trivially_constructible&lt;decltype(gets_nullptr), int*&gt;::value 是false(在至少,它在我的编译器上)。然而,我有点不清楚gets_nullptr 是否在常量初始化、静态初始化或动态初始化之后完全初始化。是哪个?

此外,为了争论,我有兴趣确保感兴趣的对象在零初始化后完全初始化并且不需要任何进一步的初始化,所以我使用gets_zero_init 方法.由于零初始化,嵌入在gets_zero_init 中的指针将保持全零位模式。

是否保证全零位模式等同于nullptr?换句话说,如果我想要gets_nullptr 的语义,我可以依靠gets_zero_init 的零初始化来提供吗?

【问题讨论】:

  • 试过std::is_trivially_constructible&lt;decltype(gets_nullptr), std::nullptr_t&gt;::value?
  • @Yakk 是的,我实际上首先尝试过。刚刚仔细检查,同样的问题。编译器是Apple LLVM version 7.3.0 (clang-703.0.31),使用libc++。

标签: c++ c++11 initialization


【解决方案1】:

我想我已经明白了。

首先,我的帖子中有一个错误。我没有意识到零初始化和常量初始化只是静态初始化的不同形式。你得到一个或另一个,而不是一个然后另一个。所以,请忽略那一点误会。

我相信gets_zero_init 和 gets_nullptr 都进行了静态初始化。第一个初始化为零,很明显。第二个得到常量初始化,因为:

  • 采用 T 的 std::atomic 构造函数是 constexpr
  • gets_nullptr 的构造函数的参数是一个常量表达式

换句话说,gets_zero_init 和gets_nullptr 都有静态初始化,因此后一个是更好的选择,因为它不依赖于假设全零位模式等同于 nullptr。

【讨论】:

    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 2021-09-11
    • 2021-12-09
    • 2016-02-01
    • 2012-02-10
    • 2020-06-22
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多