HOWTO · Kotlin
Kotlin でのインライン関数の使用
Kotlin では、インライン関数を使用してより高度な関数を効率的に処理できます。 この記事では、Kotlin のインライン関数について知っておくべきことをすべて説明します。
このページの内容
ほとんどの Kotlin プロジェクトは高次関数を使用しているため、Kotlin プロジェクトでは問題になる可能性があります。 各高階関数はクラスのオブジェクトであるため、クロージャーが必要です。
これは、高階関数が呼び出されるたびにメモリ割り当てが必要であることを意味します。 したがって、高階関数を呼び出すたびに実行時のオーバーヘッドが発生します。
Kotlin は、この問題を解決するために inline 関数を提供します。 この記事では、Kotlin inline 関数の概念と、メモリ効率を向上させるためにそれらを使用できる場合について紹介します。
Kotlin inline 関数
Kotlin inline 関数はキーワード inline を使用して宣言されます。 関数を宣言する直前にキーワードを記述する必要があります。
Kotlin inline 関数を使用すると、高階関数のメモリ効率が向上します。 inline 関数を使用すると、関数コードを呼び出しサイトにコピーするようにコンパイラに指示し、メモリ割り当てを防ぎます。
Kotlin の inline 関数の基本的な例を次に示します。
fun main(args: Array<String>) {
exampleFunc({ println("This function will call our inline function")})
}
inline fun exampleFunc(Func: () -> Unit ) {
Func()
print("This is an inline function call and doesn't require memory allocation")
}
出力:
inline 関数を使用しない場合
inline 関数は、より高度な関数をより効率的にするための優れた方法を提供しますが、次のような使用をサポートしない宣言やシナリオがいくつかあります。
- ローカルクラス宣言
- ネストされた内部クラス宣言
- 関数式
- ローカル関数宣言
- オプションパラメータのデフォルト値
inline 関数を使用する最適なシナリオ
inline 関数は、すべての状況で役立つわけではありません。 Kotlin inline 関数を使用する最適なシナリオは次のとおりです。
- 高次関数へのアクセス中
- メモリ割り当て効率を高めるには
- 関数型パラメータを渡す場合
- 制御フローを改善するには
- 関数が別の関数をパラメーターとして受け入れる場合
- 関数がパラメータとしてラムダを受け入れる場合
具体化された型パラメーターで Kotlin inline 関数を使用する
Kotlin inline 関数を使用して、呼び出し中に渡されたパラメーターのデータ型にアクセスして取得できます。 reified 修飾子を使用してそれを行うことができます。
fun main(args: Array<String>) {
exampleFunction<String>()
}
inline fun <reified S> exampleFunction() {
print(S::class)
}
出力:
Kotlin inline 関数で noinline を使用する
関数 inline を宣言すると、そのすべてのパラメーターは inline になります。 ただし、一部のパラメーターのみを inline にしたい場合は、noinline 修飾子を使用できます。
前に noinline 修飾子を使用するすべての式は非インライン化されます。
Kotlin inline 関数での noinline の使用を理解するには、この例を検討してください。
fun main(args: Array<String>){
println("Start")
inlineFuncExample({ println("This is the first expression/parameter")
return }, // This will not throw an error as it is an inline expression
{ println("This is the first expression/parameter")
return } ) // This will throw an error as it is not an inline expression
println("End")
}
inline fun inlineFuncExample( para1: () -> Unit, noinline para2: () -> Unit ) {
para1()
para2()
}
出力: