下面的代码应该初始化一个static thread-local和static结构。
#include <iostream>
struct Tracer {
public:
Tracer(const char *new_name) : name{new_name} {
printf("%s : Constructor()\n", this->name);
}
~Tracer() {
printf("%s : Destructor()\n", this->name);
}
private:
const char *name;
};
// 1. Thread-Local Storage Duration
static thread_local Tracer t_thread_local{"Thread-Local Storage Duration"};
// 2. Static Storage Duration
static Tracer t_static{"Static Storage Duration"};
int main() {
printf("Start Program\n");
}但是,我没有看到来自static thread-local struct /Destructor的消息。输出仅显示来自static结构的消息。我是不是遗漏了什么?
Static Storage Duration : Constructor()
Start Program
Static Storage Duration : Destructor()发布于 2019-12-31 04:32:39
您的假设是,仅仅声明和定义这些对象必然会触发main前的构造,这是不正确的。
[basic.stc.thread/2]:[注意:具有线程存储持续时间的变量被初始化为basic.start.static、basic.start.dynamic和stmt.dcl中指定的变量,如果被构造,则在线程退出(basic.start.term)时销毁。-尾注]
[basic.start.dynamic/5]:它是实现定义的,是在main的第一个语句之前对具有静态存储时间的非本地非内联变量的动态初始化进行排序,还是延迟。如果延迟,它强烈地发生在任何非初始化odr-使用任何非内联函数或非内联变量定义在同一个转换单元中要初始化的变量。。。
事实上,在basic.start.dynamic中有许多类似的规则。
重点是,您的程序做得不多,而且它肯定不使用t_thread_local,所以这取决于编译器是否真正存在t_thread_local,如果是的话,则取决于何时存在。
https://stackoverflow.com/questions/59539536
复制相似问题