@inline
州的文档:
请求编译器应特别努力内联注释方法的方法的注释。
但是,与类似的@tailrec
注释不同,编译器不会(默认情况下)提供有关它是否设法内联方法的任何信息。
有没有办法确定编译器是否设法内联带注释的方法?
具体来说,我希望编译器告诉我,例如,在所有合理的情况下,它都能够内联我标记的方法。 (我可以想到一些情况,它会警告我它不能内联一个方法,如果它不是final
,因此如果该类是子类,则需要vtable查找)
相关问题:
答案 0 :(得分:6)
首先,您需要记住,当您使用-optimise
(或我认为-Yinline
)进行编译时,Scalac只会尝试内联。
考虑以下简单案例:
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
,内联警告将会消失,并且该方法将正确内联。
希望有所帮助。