As we have seen from earlier sections, functions are instances of objects, and, of course, each instance requires an allocation in the heap. There are also method invocations required when invoking the function. Overall, using functions introduces overhead.
Kotlin allows us to avoid this overhead by use of the inline keyword. This keyword indicates to the compiler that the function marked as inline, as well as function parameters, should be expanded and generated inline at the call site, hence the name.
What does this mean exactly? Let's consider a function that handles resources in a safe manner—that is, the resource will always be closed correctly, even if the code throws an exception:
fun <T : AutoCloseable, U> withResource(resource: T, fn: (T) -> U): U { try { return fn(resource) } finally { resource...