【问题标题】: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?
你不应该像这样使用obj2,obj1 是正确的方法。如果你想避免inline,你可以使用extern 代替obj2。