读取旧的答案对我什么时候应该写关键字"内联"的函数/方法?说的是:
据说内联提示您认为该函数应该内联到编译器.这可能是在1998年,但十年后编译器不需要这样的提示.更不用说人类在优化代码时通常是错误的,因此大多数编译器都会忽略"提示".
这个答案是在2009年发布的,所以我想最终想出来:
inline用户指定的提示并且只是自动执行此操作?inline提示只停留于提供向后兼容性?1.这样这个答案是不正确的?inline关键字的存在选择的文档,但GCC 5.1.0 inline在决定时也会考虑关键字).该inline关键字不具有意义,但不意味着你可能期望.这并不意味着编译器必须/应该/可能内联扩展函数,编译器可能决定按照它认为合适的方式执行,无论您是否使用inline.
它的意思是你应该并且可以在每个使用它的编译单元中重复函数定义,而不会导致链接错误 - 非常类似于static关键字.
例如,GCC 4.7.2(可能不是最先进的,但仍然是相当现代的编译器)似乎只能解释inline标准指定的内容.如果禁用优化并且启用了优化,它似乎没有内联函数它似乎无论如何都是内联的.唯一的区别是编译器在不同情况下如何处理"概述"函数,内联它只是丢弃它或以避免链接时重复符号的方式处理它.
- 现代 c++11 兼容编译器是否总是忽略用户指定的内联提示并仅自动执行此操作?
C++11 在这里无关紧要,C++11 标准没有改变语义,inline并且编译器优化在很大程度上独立于正在编译的语言版本。
- 内联提示是否仅用于提供向后兼容性?
不,inline不是提示,编译器不会“忽略”,inline因为如果这样做,您会收到多个定义错误。编译器赋予inline关键字的含义并不是您似乎理解的含义。这不是一个提示。
如果编译器看不到函数定义,则无法内联它(链接时优化改变了这一点,但 LTO 的使用还不是很广泛,并且大多数库不附带支持链接时的支持 LTO 的二进制文件内联)。
您应该理解inline为“此函数定义在此文件中内联显示”,而不是“对此函数的调用应内联”。
因此,inline关键字对于允许编译器查看多个文件中的函数定义很有用,这意味着它可以通过内联来优化调用。这并不一定意味着它比同一翻译单元中定义的任何其他函数更有可能被内联。
对于从多个翻译单元调用的函数,在标头中定义函数并使其成为编译器内联它们的inline必要条件,但这还不够(因为编译器的内联决策基于其他条件)。
这与向后兼容性无关,今天和 2009 年都是如此。
| 归档时间: |
|
| 查看次数: |
1391 次 |
| 最近记录: |