我相信我理解内联函数的基础知识:代替函数调用导致参数被放置在堆栈上并发生调用操作,函数的定义在编译时被复制到调用的位置,从而节省运行时的调用开销。
所以我想知道:
scalac是否使用智能内联某些功能(例如私有def)而没有注释提示?
如何判断提示scalac内联函数何时是一个好主意?
任何人都可以分享应该或不应该内联的函数或调用的示例吗?
答案 0 :(得分:34)
从不@inline
任何实施可能会合理改变的内容,以及 的公共部分。
当我说“实施改变”时,我的意思是逻辑实际上可能会改变。例如:
object TradeComparator extends java.lang.Comparator[Trade] {
@inline def compare(t1 : Trade, t2 : Trade) Int = t1.time compare t2.time
}
让我们说“自然比较”然后改为基于原子计数器。您可能会发现应用程序最终会有2个组件,每个组件都是根据不同版本的比较代码构建和内联的。
答案 1 :(得分:0)
就个人而言,我使用@ inline作别名:


 A类(param:Param){
 @inline def a = param.a
 def a2()= a * a
}



 现在,我找不到办法知道它是否有任何作用(我试图jad生成的.class,但无法得出任何结论)。


我的目标是明确我希望编译器做什么。但是让它决定什么是最好的,或者干脆做它能做的事情。如果它不这样做,也许以后的编译器版本会。