c++17 inline + thread_local vs thread_local



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

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

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

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

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

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

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

我们应该

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

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

最新更新