c ++ 17内联+ thread_local vs thread_local

Jes*_*Jes 6 c++ inline thread-local-storage translation-unit c++17

我想知道以下两个声明之间的区别是什么,如果两者都写在一个头文件中:

inline thread_local MyClass obj1;  // inline with thread_local
thread_local MyClass obj2;         // no inline
Run Code Online (Sandbox Code Playgroud)

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

Bap*_*cht 3

如果将此头文件包含在多个编译单元中,您将获得obj2. 但obj1会工作得很好,因为链接器将保证只存在一个定义,并且所有编译单元将使用相同的定义(因此使用相同的地址)。

因此,您的代码应该在单个编译单元中使用和定义它externobj2inline已经为您做到了obj1

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

在这种特殊情况下,不可以,因为它无法编译。但如果添加staticobj2,您将获得每个编译单元一个地址。

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

你绝对不应该obj2这样使用,obj1这是正确的方法。如果你想避免inline,你可以使用externfor obj2