状态的文档@inline
:
方法上的注释,要求编译器应该特别努力地内联带注释的方法。
但是,与类似的@tailrec
注释不同,编译器(默认情况下)不提供任何关于它是否设法内联方法的信息。
有什么方法可以确定编译器是否设法内联带注释的方法?
具体来说,我希望编译器告诉我,例如,在所有合理的情况下,它都能够内联我标记的方法。(我能想到的一些情况会警告我,如果它不是,它不能内联一个方法final
,因此如果类是子类,则需要一个 vtable 查找)
相关问题:
首先,您需要记住,Scalac 只会在您编译时尝试内联-optimise
(或者-Yinline
我认为)。
考虑以下简单情况:
class Meep {
@inline def f(x: Int) = x + 19
}
object Main extends App {
new Meep().f(23)
}
如果我用 编译它-optimise
,Scalac 会给我一个警告there were 1 inliner warnings; re-run with -Yinline-warnings for details
:现在,除了语法傻笑,这并没有给我太多。
所以让我们重新编译-Yinline-warnings
. 现在我得到:At the end of the day, could not inline @inline-marked method f
。嗯,好的,这也不是很有帮助,但我想这就是我使用私有编译器标志所得到的。:) 顺便说一下,一些内联警告更有帮助 - 比如:(Could not inline required method f because bytecode unavailable.
发生在 REPL 中)
编译器帮助解释-Yinline-warnings
为Emit inlining warnings. (Normally surpressed due to high volume)
,所以我想它必须根据具体情况使用。
无论如何,如果我们f
将上述代码段中的定义更改为@inline final def f(x: Int) = x + 19
,则内联警告将消失,并且该方法将被正确内联。
希望能有所帮助。