Kotlin中内联函数的理解
kotlin中使用高阶函数会带来一些运行时的效率损失:每一个函数都是一个对象,并且会捕获一个闭包。即那些在函数体内会访问到的变量。内存分配(对于函数对象和类)和虚拟调用会引入运行时间开销。
调用一个方法是一个压栈和出栈的过程,调用方法时将栈针压入方法栈,然后执行方法体,方法结束时将栈针移出栈,这个压栈和出栈的过程会耗费资源,这个过程中传递形参也会耗费资源。
来看一个官方的例子:
1 | fun <T> lock(l: Lock, body: () -> T): T { |
调用这个方法:
1 | lock(l, {"do something!"})//l是一个Lock对象 |
对于编译器来说,调用lock方法就要将参数l和lambda表达式{“do something!”}进行传递,还要将lock方法进行压栈出栈处理,这个过程就会耗费资源。如果只要函数体类似这样:
1 | l.lock() |
这样做的效果和调用lock方法是一样的,而且不需要压栈出栈了,但是如果代码中频繁调用lock方法,必然要复制大量重复代码,那么有没有一种机制,又能少些重复代码(变成一个可供调用的方法)又不会在调用过程中频繁压栈出栈影响性能呢。有的,这就是kotlin的内联函数inline所拥有的能力。