inline

インライン展開=インライン化といわれてもよくわからないので自分なりの解釈をします。まず、インライン化が使われる場面ですが、定義した関数が呼び出されるときに使われてます。普通私たちがプログラムで関数を呼ぶとき

fun 関数(){処理}
fun main(){
    関数()
}

と呼びだします。そして、コンパイルしたときのプログラム内での解釈も同じように解釈するのですが、inline化するとコンパイルした時の解釈が変わります。

inlinefun 関数(){処理}
fun main(){
    関数()
}

↓コンパイル後

inlinefun 関数(){処理}
fun main(){
    処理
}

inlineを使ったコンパイルではmain関数内で関数を呼び出しが行われるのではなく関数の処理を直接main関数内にコピーします。
inline化のメリットはgenerics関数のような不特定要素があるときのコンパイル処理に使われるようです。(reifiedについてはこの後説明します)

inline fun <reified T> TreeNode.findParentOfType(): T? {
    var p = parent
    while (p != null && p !is T) {
        p = p?.parent
    }
    return p as T
}
inlineの例 : 引用[3]

reified

Generics関数に渡した引数の型にアクセスが必要になるときがあります。この時にreifiedを使います。

inline fun <reified R: 型>関数名(){
    if (型 = R){ //Rをif分の条件として「使用している」
        処理
    }
}

参考文献

[1]ジェネリクス: reified でジェネリクスの型情報を維持する | まくまくKotlinノート
[2][Kotlin]インライン関数を理解する(inline, noinline, crossinline) - Qiita
[3]インライン関数 - Kotlin Programming Language
[4]kotlinのreified関数はjavaからは呼べない。 - Qiita


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です