C++中的inline关键字的旧含义是否已经被弃用?

5

在cppreference页面中,关于inline指定符号,它说道:

当函数的声明指定符序列中使用inline指定符时,将声明该函数为内联函数。

内联函数具有以下特性:
在程序中可能有一个以上的内联函数定义,只要每个定义出现在不同的翻译单位中并且所有定义都是相同的。
...

然后,稍微往下看,它说:

inline关键字的原始意图是作为一种指示优化器函数内联替换优于函数调用的指示符。...

除了这行之外,没有提到inline的此用法。C++标准是否仍然有效?还是后者被废弃而前者仍然有效?

如果后一种形式仍然有效,那么在现代编译器中使用它是否值得?我听说,即使是编译器做出关于内联的决定,使用 "inline" 关键字也会推动它一点。这是真的吗?对于这种情况,我应该在我的程序中使用 "inline" 关键字吗?

2
inline仍然是有效和必要的。原始意图是次要的。 - πάντα ῥεῖ
3
inline 的原始意图已经不重要了。它只是对编译器的建议。编译器可以在有或没有 inline 关键字的情况下进行内联。它只影响函数的链接方式。 - Eljay
6
它在“有效”的意义上是指C++标准中没有禁止它。C++标准允许C++编译器实现任何没有可观察效果的优化。因此,只要没有可观察的影响,C++编译器可以内联任何内容,无论是否使用了关键字。今天的C++编译器是否仍然使用该关键字作为提示来执行内联,只能通过对大多数编译器的经验内部知识进行回答。 - Sam Varshavchik
4
啊哈,找到了:编译器会将inline视为提示吗?。@Eljay - HolyBlackCat
2
现在的inline意味着,编译器无论找到这个函数的哪个定义(实现),我保证它们都是相同的,只需与遇到的版本链接即可。(可用于将实现放在头文件中)。 - Pepijn Kramer
显示剩余16条评论
2个回答

6

标准本身并不关心如何生成汇编代码,因此无法强制“内联”函数。

[dcl.inline]/2将其表述为建议:

... 表示实现应优先考虑在调用点内联替换函数体... 实现不需要执行此内联替换...

这篇博客文章指出GCC和Clang在一定程度上确实尊重inline提示。


后一种形式已经被弃用了吗?
正如在[dcl.inline]/2中所示,它并没有被弃用。
我最初想说他们不能废除它,因为他们不能强制执行它,但是他们未能将他们的建议标记为“注释”(这意味着它缺乏“标准化力量”),这对我来说看起来像是编辑错误。

1
inline关键字使得所有翻译单元都可以访问函数的定义,这将使编译器更容易地将函数内联而不是调用它。因此,它确实有助于内联,尽管它并没有强制要求。
当您希望函数被内联时,是否应该使用inline关键字?可能不应该,因为您可能对如何影响性能感到困惑。请注意,如果您打开链接时间优化,主要编译器仍然可以在翻译单元之间进行内联。因此,我建议您这样做,并将其余部分留给编译器。
还要注意,许多编译器有扩展功能,可以更强烈地建议编译器内联函数,例如GCC中的always_inline。如果您要使用这些扩展功能,请在之前和之后对代码进行分析,以查看您是在帮助还是损害代码性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接