我想知道以下两个声明之间的区别到底是什么?如果两者都写在一个头文件中:
inline thread_local MyClass obj1; // inline with thread_local
thread_local MyClass obj2; // no inline
如C ++ 17中所指定,向变量内联添加会强制所有转换单元看到该变量的相同地址。这是否意味着obj2
有可能以不同的转换单位获得不同的地址值?应该强调什么情况,我们应该使用obj1
而不是obj2
?
答案 0 :(得分:2)
如果将此头文件包含在多个编译单元中,则将获得obj2
的多个定义。但是obj1
可以正常工作,因为链接器将保证仅存在一个定义,并且所有编译单元将使用相同的定义(并因此使用相同的地址)。
因此,您的代码应为extern
使用obj2
并在单个编译单元中对其进行定义。但是inline
已经为您obj1
做到了。
这是否意味着
obj2
可能会获得不同的地址值 在不同的翻译单位?
在这种情况下,不会,因为它不会编译。但是,如果将static
添加到obj2
,则每个编译单元将获得一个地址。
应该强调什么情况,我们应该使用
obj1
而不是 比obj2
多吗?
您永远不要这样使用obj2
,obj1
是正确的方法。如果您想避免使用inline
,可以将extern
用于obj2
。