我已经读过inline
变量here和here,但是两个链接都没有提及inline
变量是否内联,因为编译器可以内联它们就像内联函数一样。会替换为呼叫站点上的实际值。
我知道内联变量具有外部链接和唯一地址,但是它们像函数一样内联吗?该属性是否适用于内联变量?
答案 0 :(得分:2)
两个链接都没有提及
inline
变量是否是内联的,因为它们可以像内联函数一样被编译器内联。
最有可能是因为没有理由提及这种事情。您的期望基于错误的前提。 inline
关键字与编译器是否可以内联函数无关。编译器可以选择内联未标记为inline
的函数,并且可以选择不内联标记为inline
的函数。从一开始就是这种情况,即使最初引入inline
关键字也是如此。
曾经有一段时间inline
关键字是编译器的提示,但即便如此,它也只是提示。编译器始终可以自行决定要内联哪些函数。从那时起,在决定哪些函数可以有效地内联时,编译器已变得比程序员更好。因此,大多数现代编译器都忽略了预期的提示(在完全优化时)。
已替换为呼叫站点上的实际值。
通常不能这样做。编译器可以将函数调用替换为函数的内容(其主体),因为编译器知道函数的内容是什么。相反,编译器不知道变量的内容(其值)。毕竟,这通常是声明变量的关键。由于编译器不知道“实际值”,因此编译器无法使用该值代替从变量在内存中的位置获取值的方法。
但是,在特定情况下,编译器可以推断出变量的值,可以做到这一点。与函数一样,由编译器决定是直接在机器指令中使用该值还是从变量的内存位置检索该值。关键字的使用与该决定无关(尽管在完全优化的情况下,我希望只要该值适合寄存器中的值即可使用)。唯一相关的关键字是constexpr
,这使编译器更容易推断出变量的值。