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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取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

    文章

    7626

    瀏覽量

    90140
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140200
  • C++
    C++
    +關注

    關注

    22

    文章

    2117

    瀏覽量

    74769
  • 內聯函數
    +關注

    關注

    0

    文章

    10

    瀏覽量

    2299
  • 函數調用
    +關注

    關注

    0

    文章

    19

    瀏覽量

    2649

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

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

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    C語言學習必備資料合集

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

    C++如何處理內聯函數

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

    C語言編程必備——C語言程序設計經典案例100例

    C語言編程必備——C語言程序設計經典案例100例。
    發表于 11-11 17:18 ?76次下載

    C語言標準庫函數

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

    基于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 ?3381次閱讀

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

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

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

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

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

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

    C語言函數速查手冊

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

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

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

    講解下C語言內聯函數

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

    C語言內聯函數

    函數B很小,又被頻繁的調用,可能函數調用的切換時間比函數內代碼的執行時間還長,這樣明顯劃不來,那么我們就可以將這個函數聲明為內聯(加上 in
    的頭像 發表于 02-21 16:55 ?1227次閱讀
    <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 ?2794次閱讀

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

    。 所以為了解決這種不利于調試的問題,就有了內聯函數。 那么什么是內聯函數呢? 我們以inline修飾的函數叫做
    的頭像 發表于 11-01 17:57 ?608次閱讀
    主站蜘蛛池模板: 国产精品九九久久 | 久久亚洲精品中文字幕 | 少妇高潮A片特黄久久精品网 | 免费精品美女久久久久久久久久 | beeg xxx日本老师 | 国产精品无需播放器 | 色偷偷影院 | 一本道的mv中文字幕 | 国产91综合 | 果冻传媒剧情在线观看 | 爽娇妻快高h| 伊人亚洲综合青草青草久热 | 欧美69xxx| 亚洲国产成人精品久久久久 | 蜜芽亚洲欧美一区二区电影 | 麻豆国产人妻精品无码AV | 国产AV99激情久久无码天堂 | 青青草原网址 | 日本xxxxxxxxx老师59 | 午夜福利不卡片在线播放免费 | 99精品免费久久久久久久久日本 | 久久久精品久久久久三级 | 性色爽爱性色爽爱网站 | 中文国产乱码在线人妻一区二区 | 熟妇内谢69XXXXXA片 | 夜色私人影院永久入口 | yellow日本高清在线 | 狠狠色香婷婷久久亚洲精品 | 国产人妻777人伦精品HD | 首页_亚洲AV色老汉影院 | 奇虎成人网| 亚洲免费国产在线日韩 | 色欲AV亚洲情无码AV蜜桃 | 免费精品国产日韩热久久 | a级全黄试频试看30分钟 | 儿子操妈妈| 久久毛片免费看一区二区三区 | 美女被打开了屁股进去的视频 | 国产日韩精品一区二区三区在线 | 亚洲一区二区免费看 | 先锋影音av无码第1页 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品