[英]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
会正常工作,因为链接器将保证只存在一个定义,并且所有编译单元将使用相同的定义(因此使用相同的地址)。
因此,您的代码应该为obj2
使用extern
并在单个编译单元中定义它。 但是inline
已经为obj1
做到了这一点。
这是否意味着
obj2
可以在不同的翻译单元中获得不同的地址值?
在那种特殊情况下,不,因为它不会编译。 但是,如果将static
添加到obj2
,则每个编译单元将获得一个地址。
强调我们应该使用
obj1
而不是obj2
什么?
你永远不应该像这样使用obj2
, obj1
是正确的方法。 如果你想避免inline
,你可以对obj2
使用extern
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.