gpt4 book ai didi

c++ - 为什么不需要通过内联函数进行静态初始化

转载 作者:行者123 更新时间:2023-11-28 06:48:06 25 4
gpt4 key购买 nike

以下代码片段来自 3.6.2/3 N3797 C++14 最终工作草案:

inline double fd() { return 1.0; }
extern double d1;
double d2 = d1; // unspecified:
// may be statically initialized to 0.0 or
// dynamically initialized to 0.0 if d1 is
// dynamically initialized, or 1.0 otherwise
// may be initialized statically or dynamically to 1.0
double d1 = fd();

据我了解该示例,不需要静态完成 d1 和 d2 的初始化。 double d2 = d1 很好理解(d1 不是常量表达式)。我的问题如下:为什么不需要通过内联函数进行静态初始化?

最佳答案

在这种情况下,函数被标记为 inline 的事实并没有太大变化。 inline 关键字的唯一实际作用是告诉编译器/链接器接受该函数的多个定义可能会出现在整个程序中(当将所有目标文件链接在一起时),这是需要的您直接在头文件中定义一个函数,该文件可能包含在多个翻译单元(cpp 文件)中。这是一种为您想在 header 中定义的函数设置 ODR(单一定义规则)异常(exception)的方法,我们称之为“内联定义”(或“内联函数”),这是关键字获取的地方其名称。如果您浏览 C++ 标准,您会发现大多数提及 inline 关键字的内容都是在讨论与提供内联定义相关的问题(即,在声明的地方实现函数,而不是在单独的 cpp 中实现文件)。

几乎任何其定义可供编译器使用的函数都可以作为“函数内联”的候选者(这与“内联定义”不同)。但这纯粹是编译器做出的优化选择,并不是必需的。 C++ 标准中唯一一次提到函数内联是为了明确如果编译器选择内联一个函数,它不应该对代码的行为产生任何可见的影响(它们都是这样的评论:“这应该为真,即使函数是内联的”)。 inline 关键字和“函数内联”之间的唯一关系是一个建议,在标准中,该关键字也可以被视为暗示函数内联对于该函数是可取的(因为它通常是), 但这不是必需的, 我相信许多编译器在决定是否内联函数时完全忽略它 (主要是因为编译器不需要那个提示, 他们完全有能力在他们的自己的)。

就是说,您示例中的 d1 变量是通过调用不是 constexpr 函数的函数来初始化的,这意味着它不需要静态完成。只有当函数用 constexpr 标记时,编译器才必须尝试对其进行静态评估,从而导致可能从该调用中对非局部变量进行静态初始化。将函数标记为 inline 在此上下文中没有任何区别,因为除了 ODR 的应用之外,内联函数的行为(至少,表面上)必须与任何其他函数相同。

关于c++ - 为什么不需要通过内联函数进行静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24556701/

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