Kotlinのcrossinlineとnoinlineの違いは何ですか?
質問
-
このコード は警告を伴ってコンパイルされます。 ( パフォーマンスへの影響は軽微 ):
inline fun test(noinline f: () -> Unit) { thread(block = f) }
-
このコード はコンパイルされません。 ( インラインパラメータの不正な使用 ):
inline fun test(crossinline f: () -> Unit) { thread(block = f) }
-
このコード は警告を伴ってコンパイルされます。 ( パフォーマンスへの影響は軽微 ):
inline fun test(noinline f: () -> Unit) { thread { f() } }
-
このコード は警告もエラーもなくコンパイルされます。 :
inline fun test(crossinline f: () -> Unit) { thread { f() } }
以下は私の質問です。
- なぜ(2)はコンパイルできず、(4)はコンパイルできるのでしょうか?
-
とはいったい何が違うのでしょうか?
noinline
とcrossinline
? - (3)で性能向上がないのであれば、(4)はなぜそうなるのでしょうか?
どのように解決するのですか?
からの インライン関数リファレンス :
インライン関数の中には、関数本体から直接ではなく、ローカルオブジェクトやネストされた関数などの別の実行コンテキストから、パラメータとして渡されたラムダを呼び出すものがあることに注意してください。このような場合、ローカルでない制御フローもラムダでは許されない。このことを示すために、ラムダパラメータには crossinline 修飾子を付ける必要があります。
したがって、例2.はコンパイルできません。
crossinline
はローカルな制御フローのみを強制し、式
block = f
はそれに違反します。例 1 はコンパイルできます。
noinline
はそのような動作を必要としないからです (明らかに、それは普通の関数パラメータなので)。
例1と3では、ラムダパラメータが
noinline
と表示され
inline
コンパイラは何かをインライン化したいのですが、インライン化できそうなものはすべてインライン化しないようにマークされています。
2つの関数を考えてみましょう。 A と B
A
inline fun test(noinline f: () -> Unit) {
thread { f() }
}
B
fun test(f: () -> Unit) {
thread { f() }
}
機能
A
は関数
B
のように振る舞います。
f
はインライン化されません(
B
の本文はインライン化されません。
test
であるのに対し
A
関数では、ボディに
thread { f() }
はまだインライン化されます)。
さて、これは例4には当てはまりません。
crossinline f: () -> Unit
パラメータ
が
はインライン化できますが、前述の非ローカル制御フロールール(グローバル変数に新しい値を代入するような)に違反できないだけです。また、インライン化できる場合、コンパイラはパフォーマンスの向上を想定しており、例3のような警告は出しません。
関連
-
[解決済み] const "と "val "の違いは何ですか?
-
[解決済み] Kotlinのvarとvalの違いは何ですか?
-
[解決済み】KotlinでJavaの静的メソッドに相当するものは何ですか?
-
[解決済み】KotlinのList型とArray型の違いについて
-
[解決済み】Kotlinのダブルバング(!)演算子とは?
-
[解決済み】Kotlinのコルーチンにおけるlaunch/joinとasync/awaitの違いとは?
-
[解決済み] Kotlinのジェネリックにおける "*"と "Any "の違いについて
-
[解決済み] KotlinのArrayList<String>()とmutableListOf<String>()の相違点
-
[解決済み] Kotlin データクラスのオーバーライドゲッター
-
[解決済み] アダプターまたはViewHolderでのKotlin合成
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Kotlinにコンストラクタ参照はありますか?
-
[解決済み] Kotlin: withContext() vs Async-await
-
[解決済み] Kotlinで抽象クラスのインスタンスを生成する
-
[解決済み] KotlinのIterableとSequenceは全く同じに見える。なぜ2つの型が必要なのでしょうか?
-
[解決済み] KotlinのコルーチンはRxKotlinよりどう優れているか?
-
[解決済み] Kotlinの "receiver "って何?
-
[解決済み] アダプターまたはViewHolderでのKotlin合成
-
[解決済み] kotlinのinitブロックとコンストラクタの違いは何ですか?
-
[解決済み] Android Studioでビルドする際のエラー「Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7... 」を解決するには?
-
[解決済み] KotlinはJava Lombokのアクセサーを見ない?