[kotlin] inline , noinline, crossline function

2021. 6. 18. 09:03모바일/Android_Kotlin

inline , noinline, crossline function

inline

  • 함수의 인자로 고차함수를 사용한 함수를 전달할 때 inline 을 사용하고, 익명 클래스의 생성 비용을 줄인다
  • 람다를 사용하면 각 함수는 객체로 변환되어 메모리 할당, 가상 호출 단계를 거치는데 이 비용을 줄일 수 있다.
  • Calculator 함수로 예를 들어보겠습니당
fun main() {
    val f2: Function2<Int, Int, Int> = { a, b ->
        a + b
    }
    println(calculator(4, 5, f2))
}


fun calculator(a: Int, b: Int, op: Function2<Int, Int, Int>): Int {
    return op.invoke(a, b)
}

//출력
9

이 calculator함수를 쭈욱 호출하게 되면 람다식 마다 각각의 객체가 생성되어, 비효율적이다

inline 함수가 아닐때 자바 디컴파일

public final class TestKt {
   public static final void main() {
      Function2 f2 = (Function2)null.INSTANCE;
      int var1 = calculator(4, 5, f2);
      boolean var2 = false;
      System.out.println(var1);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }

   public static final int calculator(int a, int b, @NotNull Function2 op) {
      Intrinsics.checkNotNullParameter(op, "op");
      return ((Number)op.invoke(a, b)).intValue();
   }
}
  • 이제 inline을 붙이고 decompile해보자
public final class TestKt {
   public static final void main() {
      Function2 f2 = (Function2)null.INSTANCE;
     //calculator의 함수 본문이 main안으로 들어가 객체 생성없이 효율적으로 계속 호출이 가능하다
      byte a$iv = 4;
      int b$iv = 5;
      int $i$f$calculator = false;
      int var4 = ((Number)f2.invoke(Integer.valueOf(a$iv), Integer.valueOf(b$iv))).intValue();
      boolean var5 = false;
      System.out.println(var4);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }

   public static final int calculator(int a, int b, @NotNull Function2 op) {
      int $i$f$calculator = 0;
      Intrinsics.checkNotNullParameter(op, "op");
      return ((Number)op.invoke(a, b)).intValue();
   }
}

언제 사용하는가?

  • Kotlin in Action에서 `이미 JVM은 강력하게 inline을 지원하고 있고, JVM은 코드 실행 분석을 통해 가장 이익이 되는 방법으로 inline을 하고 있다.. 라고 합니다
  • 따라서 이미 JVM에서 inline을 하고 있으므로 파라메터에 Higher-Order functions을 넘겨주는 형태가 아니라면 굳이 inline을 적용할 필요가 크지 않음을 알 수 있다.

참조