C ++ 17内联+ thread_local vs thread_local

时间:2019-07-10 22:54:05

标签: c++ c++17 inline thread-local-storage translation-unit

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

这是否意味着obj2可能会获得不同的地址值 在不同的翻译单位?

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

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

您永远不要这样使用obj2obj1是正确的方法。如果您想避免使用inline,可以将extern用于obj2