c++ - 'inline' 变量可以像内联函数一样内联吗?

标签 c++ variables c++17 inline

我已阅读有关内联变量的内容 herehere但这两个链接都没有提到内联变量是否是内联的,因为它们可以像内联函数一样被编译器内联。它被替换为调用站点上的实际值。

我知道内联变量具有外部链接和唯一地址,但它们是否像函数一样内联?该属性是否适用于内联变量?

最佳答案

both links fail to mention whether an inline variables are inline in sense that they could be inlined by the compiler just like inline functions.

很可能是因为没有理由提及这样的事情。你的期望是建立在错误的前提之上的。 inline 关键字与编译器是否可以内联函数无关。编译器可以选择内联未标记为inline的函数,也可以选择不内联标记为inline的函数。从一开始就是这种情况,即使是在首次引入 inline 关键字时也是如此。

曾经有一段时间,inline 关键字是对编译器的提示,但即便如此,它也只是一个提示。编译器始终可以自由地决定内联哪些函数。从那时起,在决定哪些函数可以有效内联时,编译器比程序员做得更好。因此,大多数现代编译器都会忽略假定的提示(在完全优化时)。

that is replaced with the actual value on call site.

这一般是无法完成的。编译器可以将函数调用替换为函数的内容(函数体),因为编译器知道函数的内容是什么。相反,编译器不知道变量的内容(其值)。毕竟,这通常是声明变量的重点。由于编译器不知道“实际值”,因此编译器无法使用该值来替代从内存中变量的位置获取值。

不过,在编译器可以推断变量值的特定情况下,这是可以完成的。与函数一样,由编译器决定是直接在机器指令中使用该值还是从变量的内存位置检索该值。关键字的使用与此决定无关(尽管在完全优化时,我希望只要该值适合寄存器即可使用该值)。唯一相关的关键字是 constexpr ,这使得编译器更容易推断出变量的值。

关于c++ - 'inline' 变量可以像内联函数一样内联吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58342373/

相关文章:

c++ - 是否可以在 C++17 的 GCC 中使用显式寄存器变量?

c++ - 默认从索引构造 std::variant

MySQL计算百分比,我可以使用变量吗?

javascript - 缓存对象项的完整路径然后使用它进行分配不起作用

variables - 获取 Sphinx 模板中的变量

c++ - MSVC 无法识别带有模板自动参数的 constexpr 函数

c++ - 将 *pointer 元素转换为一维数组

c++ - C++ 控制台输出中的上标

c++ - 切换 QDeclarativeView 的源

java - 如何在函数中使用模板来传递两种不同类型的参数?