首页 > 其他分享 >kotlin 内联函数 inline

kotlin 内联函数 inline

时间:2023-11-12 23:37:42浏览次数:32  
标签:inline 函数 synchronized lock kotlin println 内联

一、当函数被声明为内联函数(函数的前缀增加inline),那么函数体会被直接替换到函数被声明的地方,而不是被正常的调用。如下的代码

inline fun synchronized(lock: Lock, action: () -> Unit) {
    lock.lock()
    try {
        return action()
    } finally {
        lock.unlock()
    }
}

fun foo(l: Lock) {
    println("before sync")
    synchronized(l) { // 这里的函数会被替换成synchronized的代码
        println("Action")
    }
    println("after sync")
}

咱们可以看转化成java的foo函数(这里把一些无关的判断去掉)

   public static final void foo(@NotNull Lock l) {
      System.out.println("before sync");
      l.lock();
      try {
         int var2 = false;
         System.out.println("Action");
      } finally {
         l.unlock();
      }
      System.out.println("after sync");
   }

如上所述,直接将synchronized 替换到了foo本地

 

二、当inline函数赋值给临时变量,那么该临时变量不再具有inline的特性

    val l = ReentrantLock()
    val syn = ::synchronized
    syn(l) {
        println("test")
    }

如上是kotlin的先赋值给临时变量的操作,对应的java解码是

      ReentrantLock l = new ReentrantLock();
      KFunction syn = (KFunction)null.INSTANCE;
      ((Function2)syn).invoke(l, null.INSTANCE);

如上,调用通用函数的调用invoke的方式

具体的解释是:synchronized被临时变量保存起来,以便后面的使用。 官方语言:lambda表达式的代码将不能被内联,因为必须要有一个包含这些代码的对象存在

 

三、关于inline函数的传递

正常参数如果被直接调用或者作为参数传递给另外一个inline函数,该参数是可以被内联。

如一中所述:lambda默认是inline函数,所以在传入synchronized的时候也被当作内联函数继续被解析

当禁止传入的函数也被内联,则可以对该函数参数使用noinline

inline fun synchronized(lock: Lock, noinline action: () -> Unit) {
    lock.lock()
    try {
        return action()
    } finally {
        lock.unlock()
    }
}

// 则对应的foo函数的代码则为
   public static final void foo(@NotNull Lock l) {
      System.out.println("before sync");
      Function0 action$iv = (Function0)null.INSTANCE;
      l.lock();
      try {
         action$iv.invoke(); // 这里使用的是函数的调用
      } finally {
         l.unlock();
      }
      System.out.println("after sync");
   }

如上所述,使用的是invoke,而不是inline特性的替换

 

 四、使用inline的时候注意函数不宜太过复杂或者太长,因为会被替换到本地从而增加了字节码的长度。

标签:inline,函数,synchronized,lock,kotlin,println,内联
From: https://www.cnblogs.com/czwlinux/p/17825970.html

相关文章

  • [V8] Object Shapes & Inline Caching
    Benchmark:查看代码import{createBenchmark}from'./benchmark';constARRAY_SIZE=10000;constarray1=[];//{value,prop_0},{value,prop_0},{value,prop_0},{value,prop_0},constarray2=[];//{value,prop_0},{value,prop_1},{value,prop_0}......
  • kotlin 高阶函数
    一、定义:以另一个函数作为参数或者返回值的函数1、kotlin中,函数以lambda或者函数引用来表示 二、函数类型1、如下是函数的类型上述声明了函数的类型,括号内包含了该函数类型需要传入的参数类型,紧接着箭头,最后是返回的类型(在声明函数类型时候,返回类型即使是Unit也不可以省略)......
  • 一文快速实战Kotlin协程与Flow
    前言不知道大家有没有跟我一样的感受:即使自己用心在网上学过协程和Flow了,但过了一段时间就又忘掉了。这大部分的原因其实是因为我们缺少实战。我平时工作里根本就接触不到协程和Flow,自己又不敢硬往上写,万一出问题了咋整?所以一直就处于理论学习阶段,导致我学了就跟没学一样。今天就带......
  • 知乎问题采集如此轻松,Kotlin来帮忙
    知乎是国内最好的一个知识学习的平台,我们平时很多问题都能在知乎上找到很好的答案。那么今天我就用Kotlin编写一段知乎问题收集的程序,我们可以根据自己需要的问题,进行针对性的采集,非常的不错,一起来看看吧。```kotlinimportokhttp3.OkHttpClientimportokhttp3.Requestimportja......
  • 内联函数
    先看一段代码:  问题:  进出getMax的开销,比getMax函数本身的开销还要大如果使用宏:1#defineGETMAX(a,b)((a)>(b)?(a):(b))23intmain(){4intn1=GETMAX(1,2);//等价于直接写intn1=(1)>(2)?(1):(2);5return0;6}宏跟函数的区别:宏......
  • Kotlin协程学习——协程的基本介绍
    我们为什么需要学习Kotlin协程呢?我们已经有了成熟的JVM库,比如RxJava或Reactor。此外,Java本身就支持多线程,很多人也选择使用普通的回调函数。很明显,我们已经有了很多选项来执行异步操作。Kotlin协程提供了更多的功能。它们是一个概念的实现,该概念最早在1963年被描述,但等待了多年才......
  • kotlin 重载运算符
    一、二元运算符的重载1、常见的运算符有:加、减、乘、除、求余;我们要重载这些运算符的操作这里以加法重载运算符为例dataclassPoint(valx:Int,valy:Int){operatorfunplus(other:Point):Point{returnPoint(x+other.x,y+other.y)}}如上......
  • Kotlin-嵌套类_内部类_匿名内部类
    Kotlin-嵌套类&内部类&匿名内部类1.嵌套类类可以被嵌套在其它类中:classOuter{privatevalbar:Int=1classNested{funfoo(){println("fooinOuter#Nested#foo()")}funtest(){//println("Ne......
  • Kotlin语言基础入门到熟悉:Lambda 表达式
    什么是Lambda表达式?Lambda表达式,其实就是匿名函数。而函数其实就是功能(function),匿名函数,就是匿名的功能代码了。在Kotlin当中,函数也是作为类型的一种出现的,尽管在当前的版本中,函数类型的灵活性还不如Python这样的语言,不过它也是可以被赋值和传递的,这主要就体现在Lambda表......
  • Kotlin语言基础入门:Kotlin的常用写法
    Kotlin的常用写法1.方法参数的默认值可以给方法的参数指定默认值funsomeFunction(a:Int=0,b:String=""){/*方法实现*/}2.过滤列表找出列表中满足某个条件的所有元素。使用filter方法。其中x是自己定义的参数名。vallist=Arrays.asList(1,2,3,4,5,6,7)val......