gpt4 book ai didi

c++ - 内联函数访问静态?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:50 28 4
gpt4 key购买 nike

Section 16.4 of C++ FAQs (2nd Edition) (Paperback) by Marshall P. Cline, Greg Lomow表示内联函数无法安全地访问静态数据成员,因为可以在初始化静态数据成员之前调用该函数。

我不明白为什么这适用于内联函数,而不仅仅是其他翻译单元中调用另一个翻译单元中的静态数据成员的函数?我看不出“内联”在这场灾难中起什么作用?

最佳答案

static 变量在执行同一翻译单元(或多或少的 cpp 文件)中的任何函数之前完全初始化。如果 main 在不同的翻译单元中,它们不能保证在调用 main 之前被初始化。 inline 函数是重复的,每个翻译单元都有自己的拷贝。这意味着与 static 变量不同的翻译单元中的内联函数可能会在正确初始化之前尝试读取/写入该变量,从而导致未定义的行为。 (规则很复杂,不过我记得是这样的)

§ 3.6.2/4 It is implementation-defined whether the dynamic initialization of a non-local variable with static storage duration is done before the first statement of main. If the initialization is deferred to some point in time after the first statement of main, it shall occur before the first odr-use (3.2) of any function or variable defined in the same translation unit as the variable to be initialized.

§ 3.2/3 An inline function shall be defined in every translation unit in which it is odr-used.

据我所知,内联函数并不比非内联函数更危险。在不同 TU 中访问静态的任何函数都是有风险的,并且由于 inline 只是恰好将函数放在 every TU 中,所以它们中的大多数都不安全。一种解决方法是使用 "construct on first use idiom" .

隐式模板特化很复杂,但为了完整性:

§ 14.7.1/3 [temp.inst] the initialization (and any associated side-effects) of a static data member does not occur unless the static data member is itself used in a way that requires the definition of the static data member to exist.

所以模板类的静态成员总是在使用前初始化。

以上均以the static initialization order fiasco为准),前面提到的“首次使用 idom 时构造”解决了这个问题。

关于c++ - 内联函数访问静态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15234572/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com