1.1 可以將函式體直接複製到函式呼叫處
package com.example.kotlinsyntax._inline
class inlineclass
//普通函式
fundonoinline()
//呼叫處函式
funtest()
}
上面是測試用的原函式,分別是乙個inline函式,乙個普通,乙個負責呼叫這2個函式的測試函式,看下編譯的位元組碼
package com.example.kotlinsyntax._inline;
import kotlin.metadata;
@metadata
( mv =
, bv =
, k =1,
d1 =
, d2 =
)public
final
class inlineclass
public
final void donoinline()
/** * 函式呼叫處
*/public
final void test()
}
可以看到test函式內部1~4和doinline函式體完全一致,證實了函式體被直接複製到了呼叫處,5處是donoinline的呼叫,可以發現沒有講函式體複製過去
這樣可以減少乙個呼叫棧的產生,但是這種優化及其微小,而且如果inline函式體很大,呼叫他的地方有很多,這樣還會產生更多的位元組碼,使最終產生的檔案變大,那他真正的作用在**呢?
1.2 inline優化高階函式呼叫
如果乙個函式包含乙個函式型別引數,比如
//引數func 是乙個函式型別
funadvancedfunction
(func:()
-> unit)
kotlin在實現這個函式呼叫實際是為這個func函式建立乙個函式物件,然後呼叫這個函式物件的invoke方法
public
final
class inlineclass
public
final void donoinline()
public
final void advancedfunction
(@notnull function0 func)
public
final void test()
}
可以看到生成的位元組碼,jvm為我們建立了function0函式物件,最終呼叫func.invoke實現原函式呼叫。
如果advancedfunction函式是在迴圈中被呼叫呢?
while
(true))
}
那就意味著這時候會頻繁建立新的函式物件,我們在自定義view的時候都知道要避免的onmeasure和ondraw中建立物件,這樣有可能造成記憶體抖動。如何避免這種情況發生呢,inline就可以發揮作用了
inline函式可以將自身和自身的函式引數都內聯化,也就是將自身和自身的函式引數都複製到呼叫處,我們先講上面的函式改為內聯
class inlineclass
fundonoinline()
inline
funadvancedfunction
(func:()
-> unit)
funtest()
}}
檢視生成的位元組碼
//去除了doinline和donoinline的**
public
final
class inlineclass
public
final void test()
}
可以看到1~3和advancedfunction原函式**一致
5~7並不再是之前的this.advancedfunction((function0)null.instance);
而是將func函式內部的print函式**複製了過來,這樣就有效避免了重複建立物件,inline對這種情況進行了極大的優化
小結:inline可以彌補kotlin在高階函式實現上的缺陷(物件建立)
Kotlin 類補充篇之inline 和委託
標準委託 內聯類意味著類的資料會被 內聯 到該類使用的地方 適用於業務邏輯需要用到某種型別的包裝器,但是不想有額外的堆記憶體分配 1.inline 修飾類inline class password val value string 使用 不存在 password 類的真實例項物件 將字串內聯到變數 ...
內聯函式 C語言的inline內聯函式的作用
編譯器完成的,在呼叫處將函式展開,減少了呼叫函式時 進棧和出棧 壞處是會增加 段的大小 缺點 增加了編譯後的二進位制檔案的大小 為了提高執行的速度,對於一些程式 小,執行時間短但利用次數比較多的函式我們就定義為inline,對於短小的函式,可以省去call儲存現場等操作,提高程式執行速度。原文 分類...
C 中的inline函式
在函式名字前面加上inline,該函式就被宣告為內建函式。每當程式中出現對該函式的呼叫時,c 編譯器使用函式體中的代 碼插入到呼叫該函式的語句之處,而不是將流程轉出去,同時用實參代替形參,以便在程式執行時不再進行函式呼叫。引入內建函式的目的就是 消除函式呼叫時系統開銷,以提高執行速度。減少程式執行過...