【问题标题】:Is __thread guaranteed to be zero initalized?__thread 是否保证初始化为零?
【发布时间】:2021-04-05 19:31:21
【问题描述】:

我有两个变量。一个是__thread,另一个是static __thread。如果我有一个构造函数,我要做的就是将所有成员变量归零。我也碰巧只在函数体之外使用这个类。我的变量是否会初始化为零而无需我编写构造函数?


澄清一下。我有一个定义为__thread Foo foo 和static __thread Foo foo 的类。我并不是说我有一个字面上名为 __thread 的变量,我以某种方式欺骗了编译器让我在不命名类型的情况下使用它。我肯定静态是零初始化的,但是如果 __thread 撤消它或者如果没有静态的 __thread 将初始化为零,IDK 将被初始化

【问题讨论】:

  • __thread 在 C++ 中不是一个东西。这是一个 C 关键字,在 C++ 中没有任何意义。
  • @NicolBolas 一些编译器支持,请参阅stackoverflow.com/a/7047301/2527795
  • @NicolBolas 这是clang支持的gcc扩展
  • 如果您使用 C++,为什么不使用实际的 C++ 语言功能来创建线程局部变量?
  • @NicolBolas TBH 我应该用不同的方式标记它。目前它是 C++,但我可能会降级为 C。我听说 thread_local 做了更多的工作并支持我不需要的非平凡构造函数

标签: c++ thread-local-storage


【解决方案1】:

线程局部变量在任何其他构造函数之前初始化为零。如果您没有构造函数,则只完成零初始化。对于类类型,这意味着所有成员都设置为零。

以下情况会进行零初始化:

  1. 对于每个具有静态或线程本地存储持续时间且不受常量初始化约束的命名变量,在任何其他初始化之前。

如果 T 是非联合类类型,则所有基类和非静态数据成员都初始化为零,并且所有填充都初始化为零位。构造函数(如果有)将被忽略。

https://en.cppreference.com/w/cpp/language/zero_initialization

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2010-11-06
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多