'inline' 变量可以像内联函数一样被内联吗?

Can an 'inline' variable be inlined like inline functions?

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

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

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.

一般情况下是做不到的。编译器可以用函数的内容(函数体)替换函数调用,因为编译器知道函数的内容是什么。相反,编译器不知道变量的内容(它的值)。毕竟,这通常是声明变量的重点。由于编译器不知道 "actual value",因此编译器无法使用该值来替代从变量在内存中的位置获取值。

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