精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

講解下C語言的內聯函數

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

內聯函數是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;
}

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

三、內聯函數與宏

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

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

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

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

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

四、總結

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

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

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





審核編輯:劉清

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

    關注

    31

    文章

    5250

    瀏覽量

    119179
  • C語言
    +關注

    關注

    180

    文章

    7575

    瀏覽量

    133974
  • 編譯器
    +關注

    關注

    1

    文章

    1600

    瀏覽量

    48890
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6931
收藏 人收藏

    評論

    相關推薦

    內聯函數簡介

    1.內聯函數C++中我們通常定義以下函數來求兩個整數的最大值:復制代碼 代碼如下:int max(int a, int b){return a > b ? a : b;}為這么一個小
    發表于 09-11 16:22

    基于SUIF的函數內聯技術

    從基于調用圖的函數內聯技術、函數參數的映射技術和內聯使用的不同策略3 個方面討論基于SUIF 系統的內聯技術的實現。根據KAP 系統需求,提
    發表于 03-28 09:50 ?6次下載

    C++如何處理內聯函數

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

    C語言標準庫函數

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

    內聯函數詳解

    什么是內聯性和外聯函數 類的成員函數可以分為內聯函數和外聯函數
    發表于 11-02 14:05 ?0次下載

    內聯函數和外聯函數有什么區別

    內聯函數是指用inline關鍵字修飾的函數。在類內定義的函數被默認成內聯函數。
    發表于 12-15 11:52 ?5723次閱讀
    <b class='flag-5'>內聯</b><b class='flag-5'>函數</b>和外聯<b class='flag-5'>函數</b>有什么區別

    內聯函數的主要作用是什么_內聯函數C語言中的作用

    內聯函數是一種編譯機制,優點從代碼上是看不出來的,但是程序的執行效率上有差別,通常,編譯器對函數調用的處理是一種類似中斷的方式,即當執行到函數調用語句時,程序把當前所有的狀態信息比如C
    發表于 12-15 14:27 ?1.7w次閱讀
    <b class='flag-5'>內聯</b><b class='flag-5'>函數</b>的主要作用是什么_<b class='flag-5'>內聯</b><b class='flag-5'>函數</b>在<b class='flag-5'>C</b><b class='flag-5'>語言</b>中的作用

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

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

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

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

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

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

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

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

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

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

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

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

    C語言內聯函數

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

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

    。 所以為了解決這種不利于調試的問題,就有了內聯函數。 那么什么是內聯函數呢? 我們以inline修飾的函數叫做
    的頭像 發表于 11-01 17:57 ?365次閱讀