首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用初始化静态thread_local结构的构造函数和析构函数

未调用初始化静态thread_local结构的构造函数和析构函数
EN

Stack Overflow用户
提问于 2019-12-31 04:21:17
回答 1查看 155关注 0票数 2

下面的代码应该初始化一个static thread-localstatic结构。

代码语言:javascript
复制
#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结构的消息。我是不是遗漏了什么?

代码语言:javascript
复制
Static Storage Duration : Constructor()
Start Program
Static Storage Duration : Destructor()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,如果是的话,则取决于何时存在。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59539536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档