0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言內(nèi)聯(lián)函數(shù),提升C技巧必備

jf_BxU6dNQb ? 來源:混說Linux ? 2023-02-16 09:16 ? 次閱讀

內(nèi)聯(lián)函數(shù)是C語言C++中借鑒過來的,適當(dāng)?shù)氖褂脙?nèi)聯(lián)函數(shù)可以提高程序的執(zhí)行效率。本篇文章就來講解下內(nèi)聯(lián)函數(shù),趕緊來看下吧!

一、函數(shù)調(diào)用

在講內(nèi)聯(lián)函數(shù)之前,我們需要先了解函數(shù)調(diào)用,而函數(shù)調(diào)用,又不得不說函數(shù)調(diào)用的開銷。

一個函數(shù)執(zhí)行的時候,經(jīng)常會調(diào)用另一個函數(shù),比如執(zhí)行函數(shù)A時,我們需要對一些數(shù)據(jù)進行處理,將運算結(jié)果暫存在R0寄存器,接著要調(diào)用另一個函數(shù)B,而函數(shù)B也用到了R0這個寄存器(用于保存函數(shù)的返回值),原本函數(shù)A暫存在R0寄存器的值就被改變了,這樣做肯定不行。

現(xiàn)代計算機系統(tǒng)的做法都是會在執(zhí)行函數(shù)B之前,先把R0寄存器的值保存到堆棧中,函數(shù)B執(zhí)行結(jié)束后,再將堆棧中的值恢復(fù)到R0寄存器中,然后函數(shù)A繼續(xù)執(zhí)行,這樣對于數(shù)據(jù)處理就不會有任何問題了。

但是,函數(shù)調(diào)用卻消耗一定的時間進行切換,這段時間用來保存現(xiàn)場和恢復(fù)現(xiàn)場,大約相當(dāng)于一兩條語句的執(zhí)行時間,這就是函數(shù)調(diào)用帶來的開銷。

4be2bc7c-ad47-11ed-bfe3-dac502259ad0.png

假如函數(shù)B很小,只有一兩行代碼,從上圖我們可以看出,真正只有函數(shù)B執(zhí)行代碼的那段時間是對我們有用的,切換帶來的就是額外的成本開銷了,如果函數(shù)A里面多次調(diào)用函數(shù)B,那開銷就更明顯了。

4c06926e-ad47-11ed-bfe3-dac502259ad0.png

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

函數(shù)B很小,又被頻繁的調(diào)用,可能函數(shù)調(diào)用的切換時間比函數(shù)內(nèi)代碼的執(zhí)行時間還長,這樣明顯劃不來,那么我們就可以將這個函數(shù)聲明為內(nèi)聯(lián)(加上 inline),編譯器在編譯時,會把內(nèi)聯(lián)函數(shù)的實現(xiàn)替換到每個調(diào)用內(nèi)聯(lián)函數(shù)的地方(可以與宏函數(shù)做類比),在調(diào)用處將代碼展開,相當(dāng)于自動將函數(shù)B的代碼在調(diào)用它的地方復(fù)制了一份副本,沒有了保護現(xiàn)場和恢復(fù)現(xiàn)場的時間,從而節(jié)省了函數(shù)調(diào)用的開銷。

4c22152a-ad47-11ed-bfe3-dac502259ad0.png

內(nèi)聯(lián)函數(shù)一般要求如下:

1. 函數(shù)體積小,通常5行以內(nèi);

2. 被頻繁調(diào)用;

3. 函數(shù)內(nèi)無復(fù)雜的實現(xiàn),比如:while、for循環(huán),switch,遞歸等;

4. 函數(shù)沒有包含靜態(tài)變量。

來看一個簡單的內(nèi)聯(lián)函數(shù)的例子:

#include

//將函數(shù)max_value聲明為inline
inlineintmax_value(intx,inty)
{
return(x>y)?x:y;
}

intmain()
{
inta=1,b=2;
intm;
m=max_value(a,b);

return0;
}
main函數(shù)代碼在執(zhí)行的時候是這樣的:
intmain()
{
inta=1,b=2;
intm;
m=(1>2)?1:2;

return0;
}
內(nèi)聯(lián)函數(shù)在調(diào)用處展開了。

在c++ 中定義在類里面的函數(shù),默認情況下都是內(nèi)聯(lián)的,比如下面這種情況:

#include
usingnamespacestd;

classHunTalk_Linux
{
public:
//默認是內(nèi)聯(lián)函數(shù)
intmax_value(intx,inty)
{
return(x>y)?x:y;
}
};

intmain()
{
return0;
}

注意:函數(shù)聲明為內(nèi)聯(lián),僅僅是對編譯器的建議,如果函數(shù)比較復(fù)雜,編譯器會將其看做普通函數(shù)。

三、內(nèi)聯(lián)函數(shù)與宏

前面講到可以與宏函數(shù)做類比,那么就納悶了,為什么不直接定義一個宏,而是定義一個內(nèi)聯(lián)函數(shù)?存在即合理,自然有它存在的道理,相對于宏,內(nèi)聯(lián)函數(shù)提供了更好的方法:

參數(shù)類型檢查。編譯過程中,宏調(diào)用并不執(zhí)行類型檢查,甚至連正常參數(shù)也不檢查,內(nèi)聯(lián)函數(shù)雖然具有宏的展開特性,但其本質(zhì)仍是函數(shù),編譯器仍可以對其進行參數(shù)檢查,而宏就不具備這個功能。

在宏中的編譯錯誤很難發(fā)現(xiàn),因為它們引用的是擴展的代碼,而不是程序員鍵入的。

便于調(diào)試。內(nèi)聯(lián)函數(shù)代碼的調(diào)試信息通常比擴展的宏代碼更有用,它同樣可以支持斷點、單步......等調(diào)試功能。

接口封裝。有些內(nèi)聯(lián)函數(shù)可以用來封裝一個接口,而宏不具備這個特性。

四、總結(jié)

引入內(nèi)聯(lián)函數(shù)主要是解決一些頻繁調(diào)用的小函數(shù)造成額外時間開銷的問題,但是也要在符合一定內(nèi)聯(lián)函數(shù)的情況下使用。

使用很多的內(nèi)聯(lián)函數(shù),每個調(diào)用該函數(shù)的地方都需要替換成函數(shù)體,代碼量就會增加,代碼量就會增加也同時帶來了潛在的編譯時間的增加。

算法里面有個概念叫空間換時間,就是使用內(nèi)存占用更大的算法換取執(zhí)行速度的提升,所以說適當(dāng)?shù)氖褂脙?nèi)聯(lián)函數(shù)可以提高程序的執(zhí)行效率。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 計算機
    +關(guān)注

    關(guān)注

    19

    文章

    7360

    瀏覽量

    87632
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

    135856
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2100

    瀏覽量

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

    關(guān)注

    0

    文章

    10

    瀏覽量

    2199
  • 函數(shù)調(diào)用
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    2578

原文標(biāo)題:C語言內(nèi)聯(lián)函數(shù),提升C技巧必備

文章出處:【微信號:混說Linux,微信公眾號:混說Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言學(xué)習(xí)必備資料合集

    C語言學(xué)習(xí)必備合集主要有如下內(nèi)容: C函數(shù)瀏覽.chm c
    發(fā)表于 08-02 09:54 ?135次下載

    C++如何處理內(nèi)聯(lián)函數(shù)

    當(dāng)一個函數(shù)內(nèi)聯(lián)和虛函數(shù)時,會發(fā)生代碼替換或使用虛表調(diào)用嗎? 為了弄 清楚內(nèi)聯(lián)和虛函數(shù),讓我們將它們分開來考慮。通常,一個
    發(fā)表于 11-29 11:59 ?28次下載

    C語言編程必備——C語言程序設(shè)計經(jīng)典案例100例

    C語言編程必備——C語言程序設(shè)計經(jīng)典案例100例。
    發(fā)表于 11-11 17:18 ?76次下載

    C語言標(biāo)準(zhǔn)庫函數(shù)

    C語言標(biāo)準(zhǔn)庫函數(shù),使用C語言編程時,常用到的函數(shù)
    發(fā)表于 05-11 16:41 ?0次下載

    基于C語言標(biāo)準(zhǔn)庫函數(shù)

    基于C語言標(biāo)準(zhǔn)庫函數(shù)
    發(fā)表于 10-23 17:41 ?11次下載
    基于<b class='flag-5'>C</b><b class='flag-5'>語言</b>標(biāo)準(zhǔn)庫<b class='flag-5'>函數(shù)</b>

    Java之內(nèi)聯(lián)函數(shù)_內(nèi)聯(lián)函數(shù)的優(yōu)缺點

    內(nèi)聯(lián)函數(shù)就是指函數(shù)在被調(diào)用的地方直接展開,編譯器在調(diào)用時不用像一般函數(shù)那樣,參數(shù)壓棧,返回時參數(shù)出棧以及資源釋放等,這樣提高了程序執(zhí)行速度。Java
    發(fā)表于 12-15 15:00 ?3249次閱讀

    C++語言入門教程之C++語言程序設(shè)計函數(shù)的詳細資料概述免費下載

    本文檔的主要內(nèi)容詳細介紹的是C++語言入門教程之C++語言程序設(shè)計函數(shù)的詳細資料概述免費下載內(nèi)容包括了:1
    發(fā)表于 09-20 14:51 ?23次下載

    C++基礎(chǔ)語法之inline 內(nèi)聯(lián)函數(shù)

    上節(jié)我們分析了C++基礎(chǔ)語法的const,static以及 this 指針,那么這節(jié)內(nèi)容我們來看一下 inline 內(nèi)聯(lián)函數(shù)吧! inline 內(nèi)聯(lián)
    的頭像 發(fā)表于 09-09 09:38 ?2106次閱讀

    C++語法中的inline內(nèi)聯(lián)函數(shù)詳解

    上節(jié)我們分析了C++基礎(chǔ)語法的const,static以及 this 指針,那么這節(jié)內(nèi)容我們來看一下 inline 內(nèi)聯(lián)函數(shù)吧! inline 內(nèi)聯(lián)
    的頭像 發(fā)表于 09-09 09:33 ?3330次閱讀

    C語言函數(shù)速查手冊

    c\c++語言函數(shù)速查手冊
    發(fā)表于 06-30 14:48 ?9次下載

    C語言-內(nèi)聯(lián)函數(shù)、遞歸函數(shù)、指針函數(shù)

    這篇文章介紹C語言內(nèi)聯(lián)函數(shù)、遞歸函數(shù)、函數(shù)指針、指針函數(shù)
    的頭像 發(fā)表于 08-14 10:03 ?1637次閱讀

    講解下C語言內(nèi)聯(lián)函數(shù)

    內(nèi)聯(lián)函數(shù)C語言C++中借鑒過來的,適當(dāng)?shù)氖褂?b class='flag-5'>內(nèi)聯(lián)函數(shù)
    的頭像 發(fā)表于 02-16 09:15 ?1446次閱讀

    C語言內(nèi)聯(lián)函數(shù)

    函數(shù)B很小,又被頻繁的調(diào)用,可能函數(shù)調(diào)用的切換時間比函數(shù)內(nèi)代碼的執(zhí)行時間還長,這樣明顯劃不來,那么我們就可以將這個函數(shù)聲明為內(nèi)聯(lián)(加上 in
    的頭像 發(fā)表于 02-21 16:55 ?896次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內(nèi)聯(lián)</b><b class='flag-5'>函數(shù)</b>

    C語言函數(shù)參數(shù)介紹

    C語言數(shù)組元素作函數(shù)實參 數(shù)組元素可以用作函數(shù)實參,不能用作形參。 C語言在用數(shù)組元素作
    的頭像 發(fā)表于 03-10 14:30 ?2269次閱讀

    宏的缺陷與內(nèi)聯(lián)函數(shù)的引入

    。 所以為了解決這種不利于調(diào)試的問題,就有了內(nèi)聯(lián)函數(shù)。 那么什么是內(nèi)聯(lián)函數(shù)呢? 我們以inline修飾的函數(shù)叫做
    的頭像 發(fā)表于 11-01 17:57 ?414次閱讀