首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么`Intrinsics.checkParameterIsNotNull`没有内联?

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

Stack Overflow用户
提问于 2017-12-16 09:02:10
回答 2查看 1.6K关注 0票数 5

在Kotlin中,如果我们将一些Kotlin字节码解压缩到Java中,我们通常可以看到这样的语句,它执行空检查:

代码语言:javascript
复制
Intrinsics.checkParameterIsNotNull(foo, "foo")

如果我们深入研究,我们可以看到这个方法的反编译实现,它的实现与它的名称完全相同:

代码语言:javascript
复制
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),我知道如何和何时使用它们。

我只是问为什么一个函数不是内联的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-16 09:28:26

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

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

票数 3
EN

Stack Overflow用户

发布于 2017-12-16 09:09:55

希望有人会出现,给出一个更好、更正式的技术答案,但首先,我认为避免(甚至试图避免)标准库通常不是正确的方法。它包含了您可能应该在任何Kotlin代码库中使用的语言的基本结构。就连文档也这么说:

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

如果您担心它的大小,您可以使用特定于平台的工具来去除您不使用的任何部分--例如,您可以使用护卫 for Java,DCE插件 for JavaScript。它的大部分内容并不是相互依赖的,因此这些工具可以极大地减少最终输出从标准库中包含的代码量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47844098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档