代码之家  ›  专栏  ›  技术社区  ›  ice1000

为什么是内在的。checkParameterIsNotNull`是否未内联?

  •  5
  • ice1000  · 技术社区  · 8 年前

    在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),并且知道如何以及何时使用它们。
    我只是想问为什么函数没有内联。

    2 回复  |  直到 8 年前
        1
  •  3
  •   voddan    8 年前

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

    虽然代码可能看起来很简单,但其字节码相当长。内联会影响效率。

        2
  •  1
  •   zsmb13    8 年前

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

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

    如果您担心它的大小,可以使用特定于平台的工具来剥离它的任何不使用的部分,例如,您可以使用 Proguard 对于Java,以及 DCE plugin 对于JavaScript。它的大部分内容不是相互依赖的,因此这些工具可以大大减少标准库中最终输出的代码量。