inline
意义:函数在运行时都会生成一个对象,很多的小函数意味着额外的开销,使用内联函数则会在编译时进行优化。
// example
lock(l) { foo() }
inline fun <T> lock(lock: Lock, body: () -> T): T {...}
// generate
l.lock()
try {
foo()
}
finally {
l.unlock()
}
noinline
- 如果希望只内联一部分传给内联函数的 lambda 表达式参数,那么可以用 noinline 修饰符标记不希望内联的函数参数
inline fun foo(inlined: () -> Unit, noinline notInlined: () -> Unit) { …… }
reified
- 类型参数具体化(T)
inline和reified连用可以直接泛型类型判断p is T
inline fun <reified T> TreeNode.findParentOfType(): T? {
var p = parent
while (p != null && p !is T) {
p = p.parent
}
return p as T?
}
优点
如下代码可以很好地体现内联的作用。如果forEach方法不是内联的,就没办在这里return true,无法return外部函数
这是其中一个用途,主要用途还是优化编译,减少函数调用开销。
使用crossinline可以禁止这种non-local return行为
fun hasZeros(ints: List<Int>): Boolean {
ints.forEach {
if (it == 0) return true // returns from hasZeros
}
return false
}
inline的适用场景: 高阶工具类函数.
比如filter, map, joinToString, repeat等.
inline解决函数调用开销.
noinline阻止参数被inline.
crossinline阻止non-local return.
reified让类型参数更加具体, 好用.
More info: CSDN