6

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

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

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

4

1 回答 1

2

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

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

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

在那种特殊情况下,不,因为它不会编译。但是,如果您添加staticobj2,您将在每个编译单元中获得一个地址。

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

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

于 2020-12-01T07:25:51.247 回答