gpt4 book ai didi

c++ - 零初始化的 std::atomic 是否保证等同于用 nullptr 初始化的?

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

给定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<decltype(gets_nullptr), int*>::valuefalse (至少,它在我的编译器上)。然而,我有点不清楚是否 gets_nullptr在常量初始化、静态初始化或动态初始化之后被完全初始化。是哪个?

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

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

最佳答案

我想我已经弄清楚了。

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

我相信,gets_zero_initgets_nullptr 都进行了静态初始化。第一个获得零初始化,有点明显。第二个获得常量初始化,因为:

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

换句话说,gets_zero_initgets_nullptr 都有静态初始化,因此后者是更好的选择,因为它不依赖于假设所有-零位模式等同于 nullptr。

关于c++ - 零初始化的 std::atomic<T*> 是否保证等同于用 nullptr 初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38677919/

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