【问题标题】:c++17 inline + thread_local vs thread_localc++17 inline + thread_local vs thread_local
【发布时间】:2019-11-20 14:33:29
【问题描述】:

我想知道如果以下两个声明都写在一个头文件中,那么这两个声明之间到底有什么区别:

inline thread_local MyClass obj1;  // inline with thread_local
thread_local MyClass obj2;         // no inline

按照 C++17 中的规定,向变量添加内联会强制所有翻译单元看到该变量的相同地址。这是否意味着obj2 有可能在不同的翻译单元中获得不同的地址值?在什么情况下需要强调我们应该使用obj1 而不是obj2

【问题讨论】:

    标签: c++ c++17 inline thread-local-storage translation-unit


    【解决方案1】:

    如果你在多个编译单元中包含这个头文件,你会得到obj2的多个定义。但是obj1 可以正常工作,因为链接器将保证只存在一个定义,并且所有编译单元都将使用相同的定义(因此使用相同的地址)。

    因此,您的代码应该使用 extern 代替 obj2 并在单个编译单元中定义它。但是inline 已经为您为obj1 做了这些。

    这是否意味着obj2 有可能获得不同的地址值 在不同的翻译单元中?

    在那种特殊情况下,不,因为它不会编译。但是如果你把static 加到obj2 上,你会得到每个编译单元一个地址。

    在什么情况下要强调我们应该使用obj1 而不是 比obj2?

    你不应该像这样使用obj2obj1 是正确的方法。如果你想避免inline,你可以使用extern 代替obj2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 2018-02-01
      • 2018-12-06
      • 2017-09-11
      相关资源
      最近更新 更多