【问题标题】: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 吗?

【问题讨论】:

    标签: c++ c++11 c++14


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我猜thread_local 的案例也有类似的答案?
    • @AndrewTomazos:是的,我想是的,因为通过 [dcl.stc]/4,thread_local 说明符意味着 static 说明符,我在答案中引用的规则适用于说明符,而不是存储类。
    猜你喜欢
    • 1970-01-01
    • 2015-10-15
    • 2013-09-29
    • 2016-07-26
    • 2018-08-05
    • 1970-01-01
    • 2021-11-02
    • 2012-02-07
    • 2014-12-24
    相关资源
    最近更新 更多