【发布时间】:2011-06-03 09:12:09
【问题描述】:
我相信我了解内联函数的基础知识:不是函数调用导致参数被放置在堆栈上并发生调用操作,而是在编译时将函数的定义复制到进行调用的位置,保存运行时的调用开销。
所以我想知道:
scalac 是否在没有注释提示的情况下使用 smarts 来内联某些函数(例如私有 def)?
如何判断何时提示 scalac 内联函数是个好主意?
谁能分享应该或不应该内联的函数或调用示例?
【问题讨论】:
我相信我了解内联函数的基础知识:不是函数调用导致参数被放置在堆栈上并发生调用操作,而是在编译时将函数的定义复制到进行调用的位置,保存运行时的调用开销。
所以我想知道:
scalac 是否在没有注释提示的情况下使用 smarts 来内联某些函数(例如私有 def)?
如何判断何时提示 scalac 内联函数是个好主意?
谁能分享应该或不应该内联的函数或调用示例?
【问题讨论】:
永远不要@inline 任何实现可能会合理更改并且将成为库的公共部分的东西。
当我说“实施改变”时,我的意思是逻辑实际上可能会改变。例如:
object TradeComparator extends java.lang.Comparator[Trade] {
@inline def compare(t1 : Trade, t2 : Trade) Int = t1.time compare t2.time
}
假设“自然比较”随后更改为基于原子计数器。您可能会发现一个应用程序最终包含 2 个组件,每个组件都针对不同版本的比较代码构建和内联。
【讨论】:
就我个人而言,我使用@inline 作为别名:
class A(param: Param){
@inline def a = param.a
def a2() = a * a
}
现在,我找不到知道它是否有任何作用的方法(我试图对生成的 .class 感到厌烦,但无法得出任何结论)。
我的目标是明确我希望编译器做什么。但是让它决定什么是最好的,或者只是做它能够做的事情。如果它不这样做,也许以后的编译器版本会。
【讨论】: