内联函数的局部静态/线程局部变量?

Posted

技术标签:

【中文标题】内联函数的局部静态/线程局部变量?【英文标题】:Local static/thread_local variables of inline functions? 【发布时间】:2015-08-23 22:22:58 【问题描述】:

如果我在不同翻译单元中定义的内联函数中有一个静态局部变量或 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 吗?

【问题讨论】:

【参考方案1】:

是的,它总是同一个对象。作者:[dcl.fct.spec]/4:

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

【讨论】:

谢谢,我猜thread_local 的案例也有类似的答案? @AndrewTomazos:是的,我想是的,因为通过 [dcl.stc]/4,thread_local 说明符意味着 static 说明符,我在答案中引用的规则适用于说明符,而不是存储类。

以上是关于内联函数的局部静态/线程局部变量?的主要内容,如果未能解决你的问题,请参考以下文章

线程局部存储主要用来干啥的?

C++11中的局部静态变量初始化线程安全吗? [复制]

C++11 静态局部变量和线程

C++11:在多线程程序中使用局部静态变量导致 coredump

java线程安全问题之静态变量实例变量局部变量

java线程安全问题之静态变量实例变量局部变量