问题 内联函数的局部static / thread_local变量?


如果我有一个静态局部变量或thread_local局部变量,它位于以不同翻译单元定义的内联函数中,那么在最终程序中它们是否由标准保证具有相同的地址?

// TU1:
inline int* f() { static int x; return &x; }
extern int* a;
void sa() { a = f(); }

// TU2:
inline int* f() { static int x; return &x; }
extern int* b;
void sb() { b = f(); }

// TU3:
int *a, *b;
void sa();
void sb();
int main() { sa(); sb(); return a == b; }

以上总是会返回1吗?


8497
2017-08-23 22:22


起源



答案:


是的,它始终是同一个对象。按[dcl.fct.spec] / 4:

一个 inline 具有外部链接的功能在所有翻译单元中应具有相同的地址。一个 static 一个局部变量 extern inline 函数总是指同一个对象。在体内定义的类型 extern inline 函数在每个翻译单元中都是相同的类型。


9
2017-08-23 22:33



谢谢,我想是的 thread_local 案件有类似的答案吗? - Andrew Tomazos
@AndrewTomazos:是的,我想是的,因为通过[dcl.stc] / 4, thread_local 说明符暗示着 static 说明符,我在答案中引用的规则适用于 符,而不是存储类。 - Kerrek SB


答案:


是的,它始终是同一个对象。按[dcl.fct.spec] / 4:

一个 inline 具有外部链接的功能在所有翻译单元中应具有相同的地址。一个 static 一个局部变量 extern inline 函数总是指同一个对象。在体内定义的类型 extern inline 函数在每个翻译单元中都是相同的类型。


9
2017-08-23 22:33



谢谢,我想是的 thread_local 案件有类似的答案吗? - Andrew Tomazos
@AndrewTomazos:是的,我想是的,因为通过[dcl.stc] / 4, thread_local 说明符暗示着 static 说明符,我在答案中引用的规则适用于 符,而不是存储类。 - Kerrek SB