kotlin內(nèi)聯(lián)函數(shù)

kotlin中有個(gè)關(guān)鍵字inline康愤,被它修飾的函數(shù)稱為內(nèi)聯(lián)函數(shù)半开。那么我們來分析下它鉴未。

1.inline的作用枢冤?

當(dāng)一個(gè)函數(shù)被inline標(biāo)注后,在編譯時(shí)期铜秆,把調(diào)用這個(gè)函數(shù)的地方用這個(gè)函數(shù)的方法體進(jìn)行替換淹真。簡(jiǎn)而言之,就是說直接把代碼復(fù)制過去一份连茧,不通過方法間壓棧進(jìn)棧的方式進(jìn)行調(diào)用核蘸。

2.inline的使用

根據(jù)官方推薦的規(guī)則:
1.不帶參數(shù)巍糯,或是帶有普通參數(shù)的函數(shù),不建議使用inline客扎,編譯器會(huì)給我們一個(gè)提醒鳞贷,提示無性能提升;
2.帶有l(wèi)ambda函數(shù)參數(shù)的函數(shù)虐唠,建議使用inline搀愧,能顯著提高性能;

3.inline提高效率的原因疆偿?

在kotlin中咱筛,因?yàn)槌霈F(xiàn)了大量的高階函數(shù)--「高階函數(shù)是將函數(shù)用作參數(shù)或返回值的函數(shù)」,使得越來越多的地方出現(xiàn)函數(shù)參數(shù)不斷傳遞的現(xiàn)象,每一個(gè)函數(shù)參數(shù)都會(huì)被編譯成一個(gè)對(duì)象杆故,使得內(nèi)存分配(對(duì)于函數(shù)對(duì)象和類)和虛擬調(diào)用會(huì)增加運(yùn)行時(shí)間的開銷迅箩。所以才會(huì)出現(xiàn)inline內(nèi)聯(lián)函數(shù)〈︻酰可以通過inline的標(biāo)注饲趋,把原本需要生成的一個(gè)類的開銷節(jié)省了,同時(shí)也少了一層方法棧的調(diào)用撤蟆。

inline的其他作用

1.支持return退出函數(shù)
image.png

在上面例子中奕塑,我們?cè)趌ambda表達(dá)式可以直接return返回,但是暫時(shí)還不支持continue和break家肯,據(jù)說后面會(huì)支持龄砰。

2.禁止內(nèi)聯(lián):noinline

官網(wǎng)翻譯:如果希望只內(nèi)聯(lián)一部分傳給內(nèi)聯(lián)函數(shù)的lambda表達(dá)式函數(shù),那么可以用noinline標(biāo)記不希望內(nèi)聯(lián)的函數(shù)參數(shù)讨衣。

看下面的例子

image.png

看①②兩處换棚,一個(gè)用noinline修飾,一個(gè)沒有反镇,然后它們?cè)趥鬟f過程中明顯的差異固蚤,②中就直接報(bào)錯(cuò)了。
為什么呢歹茶?因?yàn)?strong>內(nèi)聯(lián)函數(shù)的「函數(shù)參數(shù)」不允許作為參數(shù)傳遞給非內(nèi)聯(lián)函數(shù)夕玩,如果要正常使用,那么我們需要把取消掉辆亏,當(dāng)成一個(gè)普通的參數(shù)傳遞過去风秤。

3.內(nèi)聯(lián)函數(shù)支持具體的類型參數(shù)的聲明reified

舉個(gè)例子:

fun <T> TreeNode.findParentOfType(clazz: Class<T>): T? {
    var p = parent
    while (p != null && !clazz.isInstance(p)) {
        p = p.parent
    }
    @Suppress("UNCHECKED_CAST")
    return p as T?
}

我們是這樣使用它的

treeNode.findParentOfType(MyTreeNode::class.java)

然后呢,這樣寫不優(yōu)雅,我們期望這樣寫:

treeNode.findParentOfType<MyTreeNode>()

所以,我們可以對(duì)它進(jìn)行改造下:

inline fun <reified T> TreeNode.findParentOfType(): T? {
    var p = parent
    while (p != null && p !is T) {
        p = p.parent
    }
    return p as T?
}

這樣就可以了罢维!

4.crossinline

局部加強(qiáng)內(nèi)聯(lián)優(yōu)化谒养,讓內(nèi)聯(lián)函數(shù)里的函數(shù)類型參數(shù)可以間接被調(diào)用玻募,代價(jià)是不能在lambda表達(dá)式里使用return渗常,用于參數(shù)偎巢。

看下面的例子拟糕,嵌套使用會(huì)報(bào)錯(cuò):



我們加上crossinline參數(shù):



可以正常調(diào)用了累提。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尘喝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斋陪,更是在濱河造成了極大的恐慌朽褪,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件无虚,死亡現(xiàn)場(chǎng)離奇詭異缔赠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)友题,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門嗤堰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人度宦,你說我怎么就攤上這事踢匣。” “怎么了戈抄?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵离唬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我呛凶,道長(zhǎng)男娄,這世上最難降的妖魔是什么行贪? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任漾稀,我火速辦了婚禮,結(jié)果婚禮上建瘫,老公的妹妹穿的比我還像新娘崭捍。我一直安慰自己,他們只是感情好啰脚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布殷蛇。 她就那樣靜靜地躺著,像睡著了一般橄浓。 火紅的嫁衣襯著肌膚如雪粒梦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天荸实,我揣著相機(jī)與錄音匀们,去河邊找鬼。 笑死准给,一個(gè)胖子當(dāng)著我的面吹牛泄朴,可吹牛的內(nèi)容都是我干的重抖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼祖灰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼钟沛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起局扶,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤恨统,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后三妈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體延欠,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年沈跨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了由捎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饿凛,死狀恐怖狞玛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涧窒,我是刑警寧澤心肪,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站纠吴,受9級(jí)特大地震影響硬鞍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戴已,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一固该、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糖儡,春花似錦伐坏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至金闽,卻和暖如春纯露,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背代芜。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工埠褪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓组橄,卻偏偏與公主長(zhǎng)得像荞膘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玉工,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Kotlin 中新增了「內(nèi)聯(lián)函數(shù)」羽资,內(nèi)聯(lián)函數(shù)起初是在 C++ 里面的。 那在 Kotlin 中加入內(nèi)聯(lián)函數(shù)遵班,是有什...
    chendroid閱讀 23,334評(píng)論 12 61
  • 一屠升、內(nèi)聯(lián)函數(shù)原理 使用高階函數(shù)為開發(fā)帶來了便利,但同時(shí)也產(chǎn)生了一些性能上的損失狭郑,官方是這樣描述這個(gè)問題: 使用高階...
    SheHuan閱讀 5,107評(píng)論 1 21
  • 內(nèi)聯(lián)函數(shù) 定義:用關(guān)鍵字inline修飾的函數(shù)腹暖,叫做內(nèi)聯(lián)函數(shù) 作用:它們的函數(shù)體在編譯器被嵌入每一個(gè)被調(diào)用的地方,...
    韋東锏閱讀 1,312評(píng)論 0 0
  • kotlin的內(nèi)聯(lián)函數(shù)屬于kotlin的高級(jí)特性了,也是不同于java的區(qū)別之一;至于為什么kotlin要使用內(nèi)聯(lián)...
    Villa__Mou閱讀 9,209評(píng)論 0 25
  • 在Kotlin中翰萨,lambda表達(dá)式會(huì)被正常的編譯成匿名類脏答。這表示每調(diào)用一次lambda表達(dá)式,一個(gè)額外的類就會(huì)被...
    leilifengxingmw閱讀 973評(píng)論 0 3