gpt4 book ai didi

c++ - 内联变量如何工作?

转载 作者:IT老高 更新时间:2023-10-28 11:55:31 25 4
gpt4 key购买 nike

在 2016 年奥卢 ISO C++ 标准 session 上,一项名为 Inline Variables 的提案被标准委员会投票选入 C++17。

通俗地说,什么是内联变量,它们是如何工作的,它们有什么用处?内联变量应该如何声明、定义和使用?

最佳答案

提案第一句:

The ​inline specifier can be applied to variables as well as to functions.

inline 应用于函数的保证效果是允许在多个翻译单元中通过外部链接相同地定义函数。在实践中,这意味着在标题中定义函数,该函数可以包含在多个翻译单元中。该提案将这种可能性扩展到变量。

因此,实际上(现在已接受)提案允许您使用 inline 关键字来定义外部链接 const 命名空间范围变量,或任何 静态 类数据成员,在头文件中,因此当该头包含在多个翻译单元中时产生的多个定义对链接器来说是可以的——它只选择其中的一个

直到并包括 C++14 在内,用于此的内部机制一直存在,以支持类模板中的 static 变量,但没有方便的方法来使用该机制。人们不得不诉诸诸如

之类的技巧
template< class Dummy >
struct Kath_
{
static std::string const hi;
};

template< class Dummy >
std::string const Kath_<Dummy>::hi = "Zzzzz...";

using Kath = Kath_<void>; // Allows you to write `Kath::hi`.

从 C++17 开始,我相信人们可以只写

struct Kath
{
static std::string const hi;
};

inline std::string const Kath::hi = "Zzzzz..."; // Simpler!

…在头文件中。

提案包括措辞

​An inline static data member can be defined in the class definition and may s‌​pecify a ​brace­-or­-equal­-initializer. If the member is declared with the constexpr specifier, it may be redeclared in namespace scope with no initializer (this usage is deprecated; see‌​ D.X). Declarations of other static data members shall not specify a ​brace­-or­-equal­-in‌​itializer

…这使得上面的内容可以进一步简化为

struct Kath
{
static inline std::string const hi = "Zzzzz..."; // Simplest!
};

…正如 T.C 在 a comment 中所指出的那样这个答案。

此外,​constexpr​ 说明符暗示静态数据成员和函数的 inline


<支持>笔记:¹ 对于函数 `inline` 也有一个关于优化的暗示作用,编译器应该更喜欢用直接替换函数的机器代码来替换这个函数的调用。这个提示可以忽略。

关于c++ - 内联变量如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38043442/

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