2013-01-14 23 views
10

@inline状态的文档:从编译器请求有关@inline的更多信息?

请求编译器应该尽量尤其难以内嵌注解的方法上的方法的注释。

但是,与类似的@tailrec注释不同,编译器不会(默认情况下)提供有关是否管理内联方法的任何信息。

有什么方法可以确定编译器是否设法内联一个带注释的方法?

具体来说,我希望编译器告诉我,例如,在所有合理的情况下,它将能够内联我标记的方法。 (我能想到的它会提醒我,它不能内联的方法是,如果它不是final,因此一些situtations需要一个虚函数表查找如果类的子类)

相关的问题:

+0

我猜编译时用'-Yinline-warnings'不是你要找的东西? – 2013-01-15 00:55:02

+0

可能,为什么不添加一个解释'-Yinline-warnings'的解答? –

回答

6

首先,你必须记住,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-warningsEmit inlining warnings. (Normally surpressed due to high volume),所以我想它要在使用就事论事。

无论如何,如果我们将上述代码段中的f的定义更改为@inline final def f(x: Int) = x + 19,则内联警告将消失,并且该方法将被正确内联。

希望有所帮助。

+0

完美,这正是我所寻找的。你碰巧知道对所有scala编译器选项的全面引用吗? –

+3

在shell中,您可以通过'scalac -help'获得有关所有支持选项的信息,'scalac -X'的高级选项以及'scalac -Y'的“private”选项。 – 2013-01-15 01:27:19

+0

嘿,我很尴尬地说我不知道​​。我想这就是我主要使用IDE来执行所有我的Scala任务,包括编译。 –

相关问题