chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

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

jf_BxU6dNQb ? 來源:混說Linux ? 2023-02-16 09:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

一、函數(shù)調用

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

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

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

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

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

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

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

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

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

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

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

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

2. 被頻繁調用;

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

4. 函數(shù)沒有包含靜態(tà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;
}
內聯(lián)函數(shù)在調用處展開了。

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

#include
usingnamespacestd;

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

intmain()
{
return0;
}

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

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

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

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

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

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

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

四、總結

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

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

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





審核編輯:劉清

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

    關注

    31

    文章

    5493

    瀏覽量

    127712
  • C語言
    +關注

    關注

    183

    文章

    7634

    瀏覽量

    143876
  • 編譯器
    +關注

    關注

    1

    文章

    1665

    瀏覽量

    50848
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    7447
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C語言中的內聯(lián)函數(shù)與宏

    C編程中,內聯(lián)函數(shù)和宏都用于避免函數(shù)調用的開銷并編寫可復用的邏輯部分,但它們在工作方式和安全性方面存在顯著差異。
    的頭像 發(fā)表于 07-25 15:10 ?1605次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的<b class='flag-5'>內聯(lián)</b><b class='flag-5'>函數(shù)</b>與宏

    內聯(lián)函數(shù)簡介

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

    基于SUIF的函數(shù)內聯(lián)技術

    從基于調用圖的函數(shù)內聯(lián)技術、函數(shù)參數(shù)的映射技術和內聯(lián)使用的不同策略3 個方面討論基于SUIF 系統(tǒng)的內聯(lián)技術的實現(xiàn)。根據KAP 系統(tǒng)需求,提
    發(fā)表于 03-28 09:50 ?6次下載

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

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

    內聯(lián)函數(shù)詳解

    什么是內聯(lián)性和外聯(lián)函數(shù) 類的成員函數(shù)可以分為內聯(lián)函數(shù)和外聯(lián)函數(shù)。
    發(fā)表于 11-02 14:05 ?0次下載

    內聯(lián)函數(shù)和外聯(lián)函數(shù)有什么區(qū)別

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

    內聯(lián)函數(shù)的主要作用是什么_內聯(lián)函數(shù)C語言中的作用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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