__thread 是否保证为零初始化?

问题描述

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


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

解决方法

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

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

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

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

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