欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年02月27日 16:07:39   作者:PHP開發(fā)社區(qū)  
這篇文章主要介紹了C++ inline內(nèi)聯(lián)函數(shù)詳解,有感興趣的同學(xué)可以借鑒參考下

函數(shù)是一個可以重復(fù)使用的代碼塊,CPU 會一條一條地挨著執(zhí)行其中的代碼。CPU 在執(zhí)行主調(diào)函數(shù)代碼時如果遇到了被調(diào)函數(shù),主調(diào)函數(shù)就會暫停,CPU 轉(zhuǎn)而執(zhí)行被調(diào)函數(shù)的代碼;被調(diào)函數(shù)執(zhí)行完畢后再返回到主調(diào)函數(shù),主調(diào)函數(shù)根據(jù)剛才的狀態(tài)繼續(xù)往下執(zhí)行。

一個 C/C++ 程序的執(zhí)行過程可以認(rèn)為是多個函數(shù)之間的相互調(diào)用過程,它們形成了一個或簡單或復(fù)雜的調(diào)用鏈條,這個鏈條的起點(diǎn)是 main(),終點(diǎn)也是 main()。當(dāng) main() 調(diào)用完了所有的函數(shù),它會返回一個值(例如return 0;)來結(jié)束自己的生命,從而結(jié)束整個程序。

函數(shù)調(diào)用是有時間和空間開銷的。程序在執(zhí)行一個函數(shù)之前需要做一些準(zhǔn)備工作,要將實參、局部變量、返回地址以及若干寄存器都壓入棧中,然后才能執(zhí)行函數(shù)體中的代碼;函數(shù)體中的代碼執(zhí)行完畢后還要清理現(xiàn)場,將之前壓入棧中的數(shù)據(jù)都出棧,才能接著執(zhí)行函數(shù)調(diào)用位置以后的代碼。關(guān)于函數(shù)調(diào)用的細(xì)節(jié),我們已經(jīng)在《C語言內(nèi)存精講》一章中的《一個函數(shù)在棧上到底是怎樣的》《用一個實例來深入剖析函數(shù)進(jìn)棧出棧的過程》兩節(jié)中講到。

如果函數(shù)體代碼比較多,需要較長的執(zhí)行時間,那么函數(shù)調(diào)用機(jī)制占用的時間可以忽略;如果函數(shù)只有一兩條語句,那么大部分的時間都會花費(fèi)在函數(shù)調(diào)用機(jī)制上,這種時間開銷就就不容忽視。

為了消除函數(shù)調(diào)用的時空開銷,C++ 提供一種提高效率的方法,即在編譯時將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語言中的宏展開。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)。

指定內(nèi)聯(lián)函數(shù)的方法很簡單,只需要在函數(shù)定義處增加 inline 關(guān)鍵字。請看下面的例子:

#include
using namespace std;
//內(nèi)聯(lián)函數(shù),交換兩個數(shù)的值
inline void swap(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main(){
int m, n;
cin>>m>>n;
cout<<m<<", “<<n<<endl;
swap(&m, &n);
cout<<m<<”, "<<n<<endl;
return 0;
}

運(yùn)行結(jié)果:

45 99↙ 45, 99 99, 45

注意,要在函數(shù)定義處添加 inline 關(guān)鍵字,在函數(shù)聲明處添加 inline 關(guān)鍵字雖然沒有錯,但這種做法是無效的,編譯器會忽略函數(shù)聲明處的 inline 關(guān)鍵字。

當(dāng)編譯器遇到函數(shù)調(diào)用swap(&m, &n)時,會用 swap() 函數(shù)的代碼替換swap(&m, &n),同時用實參代替形參。這樣,程序第 16 行就被置換成:

int temp;
temp = *(&m);
*(&m) = *(&n);
*(&n) = temp;
編譯器可能會將 (&m)、(&n) 分別優(yōu)化為 m、n。

當(dāng)函數(shù)比較復(fù)雜時,函數(shù)調(diào)用的時空開銷可以忽略,大部分的 CPU 時間都會花費(fèi)在執(zhí)行函數(shù)體代碼上,所以我們一般是將非常短小的函數(shù)聲明為內(nèi)聯(lián)函數(shù)。

由于內(nèi)聯(lián)函數(shù)比較短小,我們通常的做法是省略函數(shù)原型,將整個函數(shù)定義(包括函數(shù)頭和函數(shù)體)放在本應(yīng)該提供函數(shù)原型的地方。下面的例子是一個反面教材,這樣的寫法是不被推薦的:

#include
using namespace std;
//聲明內(nèi)聯(lián)函數(shù)
void swap1(int *a, int *b); //也可以添加inline,但編譯器會忽略
int main(){
int m, n;
cin>>m>>n;
cout<<m<<", “<<n<<endl;
swap1(&m, &n);
cout<<m<<”, "<<n<<endl;
return 0;
}
//定義內(nèi)聯(lián)函數(shù)
inline void swap1(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}

使用內(nèi)聯(lián)函數(shù)的缺點(diǎn)也是非常明顯的,編譯后的程序會存在多份相同的函數(shù)拷貝,如果被聲明為內(nèi)聯(lián)函數(shù)的函數(shù)體非常大,那么編譯后的程序體積也將會變得很大,所以再次強(qiáng)調(diào),一般只將那些短小的、頻繁調(diào)用的函數(shù)聲明為內(nèi)聯(lián)函數(shù)。

最后需要說明的是,對函數(shù)作 inline 聲明只是程序員對編譯器提出的一個建議,而不是強(qiáng)制性的,并非一經(jīng)指定為 inline 編譯器就必須這樣做。編譯器有自己的判斷能力,它會根據(jù)具體情況決定是否這樣做。

到此這篇關(guān)于C++ inline內(nèi)聯(lián)函數(shù)詳解的文章就介紹到這了,更多相關(guān)C++ inline內(nèi)聯(lián)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c語言描述回文數(shù)的三種算法

    c語言描述回文數(shù)的三種算法

    這篇文章主要介紹了c語言描述回文數(shù)的三種算法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C++ string字符串的修改與替換方法詳析

    C++ string字符串的修改與替換方法詳析

    這篇文章主要給大家介紹了關(guān)于C++ string字符串修改與替換方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C語言實現(xiàn)掃雷小游戲

    C語言實現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C++實現(xiàn)推箱子小游戲源碼

    C++實現(xiàn)推箱子小游戲源碼

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)推箱子小游戲源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C語言實現(xiàn)冒泡排序算法

    C語言實現(xiàn)冒泡排序算法

    冒泡排序(Bubble Sort),是一種計算機(jī)科學(xué)領(lǐng)域的較簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。
    2015-03-03
  • C語言二維數(shù)組中的查找的實例

    C語言二維數(shù)組中的查找的實例

    這篇文章主要介紹了C語言二維數(shù)組中的查找的實例的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C語言中操作字符串的函數(shù)詳解

    C語言中操作字符串的函數(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了C語言中操作字符串的函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言代碼鏈表實現(xiàn)貪吃蛇游戲

    C語言代碼鏈表實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C語言鏈表實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 基于C語言實現(xiàn)簡易的掃雷游戲

    基于C語言實現(xiàn)簡易的掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語言實現(xiàn)簡易的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++實現(xiàn)LeetCode(42.收集雨水)

    C++實現(xiàn)LeetCode(42.收集雨水)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(42.收集雨水),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論