02
Medium Kotlin
作者:Mahesh Ambekar
發布:02-09 10:03
JVM Under the Hood: Kotlin Inlining (inline, noinline, crossinline)
Kotlin's inline, noinline, and crossinline keywords are often confusing because they are about how Kotlin compiles lambdas and affects JVM bytecode, not just syntax.
重點摘要
inline causes the compiler to copy function or lambda bodies into call sites, reducing allocations and enabling non-local returns.
noinline prevents specific lambda parameters from being inlined, keeping them as objects when needed.
crossinline forbids non-local returns inside an inlined lambda, ensuring safe control flow when a lambda can't return to the caller.
This article explains how Kotlin's inline, noinline, and crossinline keywords work at the JVM and compiler level rather than as mere syntax. Inlining directs the Kotlin compiler to substitute function or lambda bodies at call sites, which can eliminate lambda object allocations, improve performance, and permit non-local returns from lambdas. noinline marks particular lambda parameters so they remain as objects and are not inlined, which is useful when a lambda must be stored or passed as a value. crossinline prevents non-local returns from an inlined lambda, making it safe to call the lambda in contexts where returning to the surrounding function would be invalid. The piece focuses on generated bytecode and practical trade-offs when choosing these modifiers.
JVM 深入解析:Kotlin 的 inline、noinline、crossinline
Kotlin 的 inline、noinline 与 crossincode 常让人困惑,因为它们涉及编译器如何处理 lambda 与 JVM 字节码,而不是仅仅语法差别。
重點摘要
inline 会将函数或 lambda 的实现内联到调用点,减少对象分配并允许非局部返回。
noinline 可阻止特定 lambda 被内联,使其保留为可传递的函数对象。
crossinline 禁止内联 lambda 中的非局部返回,确保在某些上下文中的控制流安全。
本文介绍了 Kotlin 的 inline、noinline 与 crossinline 在 JVM 与编译器层面的作用,而不是语法层面的区别。inline 指示编译器将函数或 lambda 的代码展开到调用处,从而减少 lambda 对象的分配、提升性能,并支持 lambda 的非局部返回。noinline 用于标记那些需要作为值传递或存储的 lambda,以避免被内联并保留为对象。crossinline 用来禁止内联 lambda 的非局部返回,确保在不能返回到外层函数时控制流的安全。文章侧重生成的字节码和在实际使用中各修饰符的权衡。
JVM 深入解析:Kotlin 的 inline、noinline、crossinline
Kotlin 的 inline、noinline 與 crossinline 令人困惑,是因為它們關乎編譯器如何處理 lambda 與 JVM 位元碼,而非僅是語法層面的差異。
重點摘要
inline 會把函式或 lambda 的實作內嵌到呼叫處,減少物件配置並允許非區域回傳。
noinline 可阻止特定的 lambda 被內嵌,使其保留為可傳遞的函式物件。
crossinline 禁止內嵌 lambda 中的非區域回傳,以確保在某些上下文下的控制流程安全。
本文說明 Kotlin 的 inline、noinline 與 crossinline 在 JVM 與編譯器層面的行為,而非單純語法差異。inline 指示編譯器將函式或 lambda 的程式碼展開到呼叫處,藉此消除 lambda 物件分配、提升效能,並允許 lambda 執行非區域回傳。當某個 lambda 需要作為值儲存或傳遞時,可用 noinline 標記以避免內嵌,保留函式物件。crossinline 則用於禁止內嵌 lambda 的非區域回傳,確保在不能回傳至外層的情況下控制流程仍然安全。文章聚焦於產生的位元碼與實務上的取捨。