色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

C語言內聯函數,提升C技巧必備

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

內聯函數是C語言C++中借鑒過來的,適當的使用內聯函數可以提高程序的執行效率。本篇文章就來講解下內聯函數,趕緊來看下吧!

一、函數調用

在講內聯函數之前,我們需要先了解函數調用,而函數調用,又不得不說函數調用的開銷。

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

現代計算機系統的做法都是會在執行函數B之前,先把R0寄存器的值保存到堆棧中,函數B執行結束后,再將堆棧中的值恢復到R0寄存器中,然后函數A繼續執行,這樣對于數據處理就不會有任何問題了。

但是,函數調用卻消耗一定的時間進行切換,這段時間用來保存現場和恢復現場,大約相當于一兩條語句的執行時間,這就是函數調用帶來的開銷。

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

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

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

二、內聯函數

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

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

內聯函數一般要求如下:

1. 函數體積小,通常5行以內;

2. 被頻繁調用;

3. 函數內無復雜的實現,比如:while、for循環,switch,遞歸等;

4. 函數沒有包含靜態變量。

來看一個簡單的內聯函數的例子:

#include

//將函數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函數代碼在執行的時候是這樣的:
intmain()
{
inta=1,b=2;
intm;
m=(1>2)?1:2;

return0;
}
內聯函數在調用處展開了。

在c++ 中定義在類里面的函數,默認情況下都是內聯的,比如下面這種情況:

#include
usingnamespacestd;

classHunTalk_Linux
{
public:
//默認是內聯函數
intmax_value(intx,inty)
{
return(x>y)?x:y;
}
};

intmain()
{
return0;
}

注意:函數聲明為內聯,僅僅是對編譯器的建議,如果函數比較復雜,編譯器會將其看做普通函數。

三、內聯函數與宏

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

參數類型檢查。編譯過程中,宏調用并不執行類型檢查,甚至連正常參數也不檢查,內聯函數雖然具有宏的展開特性,但其本質仍是函數,編譯器仍可以對其進行參數檢查,而宏就不具備這個功能。

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

便于調試。內聯函數代碼的調試信息通常比擴展的宏代碼更有用,它同樣可以支持斷點、單步......等調試功能。

接口封裝。有些內聯函數可以用來封裝一個接口,而宏不具備這個特性。

四、總結

引入內聯函數主要是解決一些頻繁調用的小函數造成額外時間開銷的問題,但是也要在符合一定內聯函數的情況下使用。

使用很多的內聯函數,每個調用該函數的地方都需要替換成函數體,代碼量就會增加,代碼量就會增加也同時帶來了潛在的編譯時間的增加。

算法里面有個概念叫空間換時間,就是使用內存占用更大的算法換取執行速度的提升,所以說適當的使用內聯函數可以提高程序的執行效率。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 計算機
    +關注

    關注

    19

    文章

    7488

    瀏覽量

    87854
  • C語言
    +關注

    關注

    180

    文章

    7604

    瀏覽量

    136698
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73623
  • 內聯函數
    +關注

    關注

    0

    文章

    10

    瀏覽量

    2204
  • 函數調用
    +關注

    關注

    0

    文章

    19

    瀏覽量

    2585

原文標題:C語言內聯函數,提升C技巧必備

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

收藏 人收藏

    評論

    相關推薦

    C語言學習必備資料合集

    C語言學習必備合集主要有如下內容: C函數瀏覽.chm c
    發表于 08-02 09:54 ?135次下載

    C++如何處理內聯函數

    當一個函數內聯和虛函數時,會發生代碼替換或使用虛表調用嗎? 為了弄 清楚內聯和虛函數,讓我們將它們分開來考慮。通常,一個
    發表于 11-29 11:59 ?28次下載

    C語言標準庫函數

    C語言標準庫函數,使用C語言編程時,常用到的函數
    發表于 05-11 16:41 ?0次下載

    C語言scanf函數詳解

    C語言scanf函數詳細解釋
    發表于 05-15 09:20 ?6次下載

    基于C語言標準庫函數

    基于C語言標準庫函數
    發表于 10-23 17:41 ?11次下載
    基于<b class='flag-5'>C</b><b class='flag-5'>語言</b>標準庫<b class='flag-5'>函數</b>

    Java之內聯函數_內聯函數的優缺點

    內聯函數就是指函數在被調用的地方直接展開,編譯器在調用時不用像一般函數那樣,參數壓棧,返回時參數出棧以及資源釋放等,這樣提高了程序執行速度。Java
    發表于 12-15 15:00 ?3269次閱讀

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

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

    C++基礎語法之inline 內聯函數

    上節我們分析了C++基礎語法的const,static以及 this 指針,那么這節內容我們來看一下 inline 內聯函數吧! inline 內聯
    的頭像 發表于 09-09 09:38 ?2145次閱讀

    C++語法中的inline內聯函數詳解

    上節我們分析了C++基礎語法的const,static以及 this 指針,那么這節內容我們來看一下 inline 內聯函數吧! inline 內聯
    的頭像 發表于 09-09 09:33 ?3360次閱讀

    C語言函數速查手冊

    c\c++語言函數速查手冊
    發表于 06-30 14:48 ?11次下載

    C語言-內聯函數、遞歸函數、指針函數

    這篇文章介紹C語言內聯函數、遞歸函數函數指針、指針函數
    的頭像 發表于 08-14 10:03 ?1685次閱讀

    講解下C語言內聯函數

    內聯函數C語言C++中借鑒過來的,適當的使用內聯函數
    的頭像 發表于 02-16 09:15 ?1495次閱讀

    C語言內聯函數

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

    C語言函數參數介紹

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

    宏的缺陷與內聯函數的引入

    。 所以為了解決這種不利于調試的問題,就有了內聯函數。 那么什么是內聯函數呢? 我們以inline修飾的函數叫做
    的頭像 發表于 11-01 17:57 ?441次閱讀
    主站蜘蛛池模板: 国产精品成人无码免费视频| 嘟嘟嘟在线视频免费观看高清中文| free乌克兰性xxxxhd| 各种肉黄浪荡故事集| 娇妻归来在线观看免费完整版电影 | 精品亚洲视频在线观看| 欧美高清18| 性欧美videos俄罗斯| 最近最新的日本字幕MV| 成年人视频免费在线观看| 极品虎白在线观看| 日本又黄又爽又色又刺激的视频 | 午夜人妻理论片天堂影院| 最新无码国产在线视频2020| 国产精品麻豆a在线播放| 恋夜秀场1234手机视频在线观看| 色色色999| 自拍区偷拍亚洲视频| 国产精品一国产精品免费| 奶头被客人吸得又红又肿| 亚洲国产成人精品无码区APP| 538久久视频在线| 国产人妻人伦精品熟女麻豆| 免费亚洲视频在线观看| 亚洲粉嫩美白在线| 不用播放器的黄| 久久中文字幕免费视频| 性xxx在线观看| ewp绞死vk失禁编| 久久人妻少妇嫩草AV蜜桃35I| 午夜福利理论片在线播放| av天堂网2014在线| 久久久久免费视频| 校园刺激全黄H全肉细节文| 把内衣脱了把奶露出来| 久久伊人青青| 亚洲精品色情婷婷在线播放| 国产51麻豆二区精品AV视频| 快播看黄片| 杨幂被视频在线观看| 国产午夜精品一区二区理论影院|