inline函数
使用高阶函数会有运行时的开销:每个函数都是一个对象,并且函数会持有一个闭包。比如函数方法体中的访问变量。内存分配(函数和类的内存分配)和虚拟调用导致运行时开销。在大多数情况下,这种开销都是可以通过inline lambda表达式消除影响,如下例所示:
lock(l) { foo() }
编译器可能会替换创建函数对象以及产生一次调用的方式,而采用下面的方式:
l.lock()
try {
foo()
}
finally {
l.unlock()
}
为了让编译器做这样的工作,我们只需要将lock函数标记为inline:
inline fun <T> lock(lock: Lock, body: () -> T): Unit {}
inline修饰符影响函数和传入的lambda表达式,它们都会被嵌入到调用位置。inline可能会导致生成的代码量增加,但是如果以合理的方式(不要inline大的功能函数)使用,将会增加性能,特别是循环中。