面试题答案
一键面试适用场景
- 小型、频繁调用的函数:当函数体逻辑简单且会被大量调用时,使用内联函数结合泛型实化能减少函数调用开销从而提升性能。例如,一个用于交换两个变量值的函数,如果在不同数据类型(如
Int
、Double
等)场景下频繁使用,使用内联函数与泛型实化可以避免每次调用函数的栈操作开销。 - 特定类型优化:当泛型类型在编译期已知时,泛型实化与内联函数结合能利用编译期优化。比如在编写集合操作函数时,当明确集合元素类型时,编译器可针对该类型做特定优化,同时内联函数减少函数调用开销。
平衡关系示例(以 Kotlin 为例)
// 定义一个内联函数并使用泛型实化
inline fun <reified T> swap(list: MutableList<T>, index1: Int, index2: Int) {
if (index1 in list.indices && index2 in list.indices) {
val temp = list[index1]
list[index1] = list[index2]
list[index2] = temp
}
}
fun main() {
val intList = mutableListOf(1, 2, 3)
swap(intList, 0, 2)
println(intList)
val doubleList = mutableListOf(1.0, 2.0, 3.0)
swap(doubleList, 0, 2)
println(doubleList)
}
在这个例子中,swap
函数是内联的,并且通过reified
关键字实现了泛型实化。由于函数逻辑简单且会被频繁调用,内联避免了函数调用开销。同时,泛型实化让编译器在编译期就知道具体类型,从而避免为每种类型都生成一份重复代码,一定程度上控制了代码膨胀。如果函数体非常复杂,即使使用了泛型实化,过多的内联可能还是会导致代码膨胀,此时可考虑拆分复杂函数为多个简单内联函数或者采用其他优化策略。