自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

本文轉(zhuǎn)載自微信公眾號「混說Linux」,作者HunTalk_Linux。轉(zhuǎn)載本文請聯(lián)系混說Linux公眾號。

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

一、函數(shù)調(diào)用

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

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

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

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

圖片

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

圖片

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

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

圖片

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

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

2. 被頻繁調(diào)用;

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

4. 函數(shù)沒有包含靜態(tài)變量。

來看一個(gè)簡單的內(nèi)聯(lián)函數(shù)的例子:

#include <stdio.h>

// 將函數(shù) max_value 聲明為 inline
inline int max_value(int x, int y)
{
return (x>y) ? x:y;
}

int main()
{
int a = 1, b = 2;
int m;
m = max_value(a, b);

return 0;
}

main函數(shù)代碼在執(zhí)行的時(shí)候是這樣的:

int main()
{
int a = 1, b = 2;
int m;
m = (1>2) ? 1:2;

return 0;
}

內(nèi)聯(lián)函數(shù)在調(diào)用處展開了。

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

#include <iostream>
using namespace std;

class HunTalk_Linux
{
public:
//默認(rèn)是內(nèi)聯(lián)函數(shù)
int max_value(int x, int y)
{
return(x>y) ? x:y;
}
};

int main()
{
return 0;
}

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

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

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

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

在宏中的編譯錯(cuò)誤很難發(fā)現(xiàn),因?yàn)樗鼈円玫氖菙U(kuò)展的代碼,而不是程序員鍵入的。

便于調(diào)試。內(nèi)聯(lián)函數(shù)代碼的調(diào)試信息通常比擴(kuò)展的宏代碼更有用,它同樣可以支持?jǐn)帱c(diǎn)、單步......等調(diào)試功能。

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

四、總結(jié)

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

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

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

本文轉(zhuǎn)載自微信公眾號「??混說Linux??」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系混說Linux公眾號。

責(zé)任編輯:武曉燕 來源: 混說Linux
相關(guān)推薦

2021-06-01 07:16:21

C語言基礎(chǔ)代碼

2010-02-01 15:47:04

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

2010-02-05 14:28:08

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

2023-11-20 09:57:03

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

2022-08-05 13:38:08

C語言庫函數(shù)printf()

2010-02-05 15:59:26

C++函數(shù)重載

2022-02-11 16:01:14

C語言技巧命令

2022-01-10 18:11:42

C語言應(yīng)用技巧

2021-10-14 07:55:17

提示技巧C#

2023-09-26 12:02:34

C++循環(huán)

2011-03-30 11:01:13

C語言隨機(jī)

2023-11-12 23:14:05

函數(shù)C 語言

2011-07-25 17:31:49

iPhone Objective-

2024-01-22 00:35:00

C++函數(shù)開發(fā)

2010-01-13 16:44:03

C++

2011-04-19 13:07:27

LinuxC語言

2023-01-03 15:47:09

Linux內(nèi)核C語言

2022-09-20 11:07:00

C語言X-MACRO技巧

2010-01-12 10:11:36

學(xué)習(xí)C++語言

2010-01-12 15:24:48

C++語言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號