为什么`Intrinsics.checkParameterIsNotNull`没有内联?

在Kotlin中,如果我们将一些Kotlin字节码反编译为Java,我们经常可以看到这样的语句:

Intrinsics.checkParameterIsNotNull(foo, "foo") 

如果我们继续探索,我们可以看到这个方法的反编译实现,它的实现和它的名字完全一样:

 public static void checkParameterIsNotNull(Object value, String paramName) { if (value == null) { throwParameterIsNullException(paramName); } } 

由于这个类( Intrinsics )的存在,我不能使用没有stdlib的Kotlin,即使我尽我所能避免使用stdlib中的函数,它也会自动生成对Intrinsics.checkParameterIsNotNull调用。

由于这个方法的实现非常短(而且很常见),为什么这个函数没有内联呢?

有没有一些注释可以让我们阻止Kotlin编译器生成这个空检查? (也许像@TrustedNotNull

对于ProGuard:我很担心,因为我正在使用共享库,在这种情况下ProGuard不适合我。 我显然知道那些代码清除工具(ProGuard,dce-js),我知道如何以及何时使用它们。
我只是问为什么是一个函数不内联。

我的猜测是,调用这个最后的方法比内联更有效率。

虽然代码可能看起来很简单,但是它的字节代码相当长。 内联会损害效率。

希望有人会出现,给出一个更好,更正式的技术答案,但对于初学者,我认为避免(甚至试图避免)标准库是不正确的方法。 它包含您可能应该在任何Kotlin代码库中使用的语言的基本结构。 即使是文件说:

Kotlin标准图书馆提供Kotlin日常工作的生活必需品。

如果您担心它的大小,可以使用特定于平台的工具来剥离您不使用的任何部分 – 例如,您可以使用Proguard for Java和JavaScript的DCE插件 。 它的大部分内容不是相互依赖的,所以这些工具可以大大减少最终输出将包含在标准库中的代码量。

正如已经说过的那样,Kotlin语言只能通过stdlib展现出真正的力量。 所以我没有看到Intrinsics内联的原因。 不应该认真的有一个客户试图避免stdlib。