为什么 `Intrinsics.checkParameterIsNotNull` 没有内联?
Why `Intrinsics.checkParameterIsNotNull` is not inlined?
在Kotlin中,如果我们将一些Kotlin字节码反编译为Java,我们经常可以看到这样的语句做null检查:
Intrinsics.checkParameterIsNotNull(foo, "foo")
如果进一步探索,我们可以看到该方法的反编译实现,它的实现与它的名称完全相同:
public static void checkParameterIsNotNull(Object value, String paramName) {
if (value == null) {
throwParameterIsNullException(paramName);
}
}
由于这个class(Intrinsics
)的存在,没有stdlib我就无法使用Kotlin,即使我尽量避免使用stdlib中的函数,它也会自动生成调用 Intrinsics.checkParameterIsNotNull
。
既然这个方法的实现很短(而且出现得非常非常频繁),为什么不内联这个函数?
是否有一些注释可以让我们阻止 Kotlin 编译器生成此 null 检查? (可能类似于 @TrustedNotNull
)
对于 ProGuard:我很担心,因为我正在处理共享库,而 ProGuard 在这种情况下不适合我。我当然知道那些代码消除工具(ProGuard、dce-js),我知道如何以及何时使用它们。
我只是问为什么函数没有内联。
希望有人会出现并给出更好、更官方的技术答案,但对于初学者来说,我认为避免(或什至试图避免)标准库通常不是正确的方法。它包含您可能应该在任何 Kotlin 代码库中使用的语言的基本结构。就连 docs 也这么说:
The Kotlin Standard Library provides living essentials for everyday work with Kotlin.
如果您担心它的大小,您可以使用特定于平台的工具来去除您不使用的任何部分 - 例如,您可以使用 Proguard for Java, and the DCE plugin 代替 JavaScript .它的大部分内容并不相互依赖,因此这些工具可以大大减少最终输出将包含的标准库代码量。
我的猜测是调用此 final 方法比内联它更有效。
虽然代码看起来很简单,但是字节码比较长。内联它会损害效率。
在Kotlin中,如果我们将一些Kotlin字节码反编译为Java,我们经常可以看到这样的语句做null检查:
Intrinsics.checkParameterIsNotNull(foo, "foo")
如果进一步探索,我们可以看到该方法的反编译实现,它的实现与它的名称完全相同:
public static void checkParameterIsNotNull(Object value, String paramName) {
if (value == null) {
throwParameterIsNullException(paramName);
}
}
由于这个class(Intrinsics
)的存在,没有stdlib我就无法使用Kotlin,即使我尽量避免使用stdlib中的函数,它也会自动生成调用 Intrinsics.checkParameterIsNotNull
。
既然这个方法的实现很短(而且出现得非常非常频繁),为什么不内联这个函数?
是否有一些注释可以让我们阻止 Kotlin 编译器生成此 null 检查? (可能类似于 @TrustedNotNull
)
对于 ProGuard:我很担心,因为我正在处理共享库,而 ProGuard 在这种情况下不适合我。我当然知道那些代码消除工具(ProGuard、dce-js),我知道如何以及何时使用它们。
我只是问为什么函数没有内联。
希望有人会出现并给出更好、更官方的技术答案,但对于初学者来说,我认为避免(或什至试图避免)标准库通常不是正确的方法。它包含您可能应该在任何 Kotlin 代码库中使用的语言的基本结构。就连 docs 也这么说:
The Kotlin Standard Library provides living essentials for everyday work with Kotlin.
如果您担心它的大小,您可以使用特定于平台的工具来去除您不使用的任何部分 - 例如,您可以使用 Proguard for Java, and the DCE plugin 代替 JavaScript .它的大部分内容并不相互依赖,因此这些工具可以大大减少最终输出将包含的标准库代码量。
我的猜测是调用此 final 方法比内联它更有效。
虽然代码看起来很简单,但是字节码比较长。内联它会损害效率。