內(nèi)聯(lián)函數(shù)是C語言從C++中借鑒過來的,適當?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)用的開銷。
一個函數(shù)執(zhí)行的時候,經(jīng)常會調(diào)用另一個函數(shù),比如執(zhí)行函數(shù)A時,我們需要對一些數(shù)據(jù)進行處理,將運算結(jié)果暫存在R0寄存器,接著要調(diào)用另一個函數(shù)B,而函數(shù)B也用到了R0這個寄存器(用于保存函數(shù)的返回值),原本函數(shù)A暫存在R0寄存器的值就被改變了,這樣做肯定不行。
現(xiàn)代計算機系統(tǒng)的做法都是會在執(zhí)行函數(shù)B之前,先把R0寄存器的值保存到堆棧中,函數(shù)B執(zhí)行結(jié)束后,再將堆棧中的值恢復到R0寄存器中,然后函數(shù)A繼續(xù)執(zhí)行,這樣對于數(shù)據(jù)處理就不會有任何問題了。
但是,函數(shù)調(diào)用卻消耗一定的時間進行切換,這段時間用來保存現(xiàn)場和恢復現(xiàn)場,大約相當于一兩條語句的執(zhí)行時間,這就是函數(shù)調(diào)用帶來的開銷。
假如函數(shù)B很小,只有一兩行代碼,從上圖我們可以看出,真正只有函數(shù)B執(zhí)行代碼的那段時間是對我們有用的,切換帶來的就是額外的成本開銷了,如果函數(shù)A里面多次調(diào)用函數(shù)B,那開銷就更明顯了。
二、內(nèi)聯(lián)函數(shù)
函數(shù)B很小,又被頻繁的調(diào)用,可能函數(shù)調(diào)用的切換時間比函數(shù)內(nèi)代碼的執(zhí)行時間還長,這樣明顯劃不來,那么我們就可以將這個函數(shù)聲明為內(nèi)聯(lián)(加上 inline ),編譯器在編譯時,會把內(nèi)聯(lián)函數(shù)的實現(xiàn)替換到每個調(diào)用內(nèi)聯(lián)函數(shù)的地方( 可以與宏函數(shù)做類比 ),在調(diào)用處將代碼展開,相當于自動將函數(shù)B的代碼在調(diào)用它的地方復制了一份副本,沒有了保護現(xiàn)場和恢復現(xiàn)場的時間,從而節(jié)省了函數(shù)調(diào)用的開銷。
內(nèi)聯(lián)函數(shù)一般要求如下:
- 函數(shù)體積小,通常5行以內(nèi);
- 被頻繁調(diào)用;
- 函數(shù)內(nèi)無復雜的實現(xiàn),比如:while、for循環(huán),switch,遞歸等;
- 函數(shù)沒有包含靜態(tài)變量。
來看一個簡單的內(nèi)聯(lián)函數(shù)的例子:
#include
// 將函數(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í)行的時候是這樣的:
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ù),默認情況下都是內(nèi)聯(lián)的,比如下面這種情況:
#include
using namespace std;
class HunTalk_Linux
{
public:
//默認是內(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ù)比較復雜,編譯器會將其看做普通函數(shù)。
三、內(nèi)聯(lián)函數(shù)與宏
前面講到可以與宏函數(shù)做類比,那么就納悶了,為什么不直接定義一個宏,而是定義一個內(nèi)聯(lián)函數(shù)?存在即合理,自然有它存在的道理,相對于宏,內(nèi)聯(lián)函數(shù)提供了更好的方法:
- 參數(shù)類型檢查 。編譯過程中,宏調(diào)用并不執(zhí)行類型檢查,甚至連正常參數(shù)也不檢查,內(nèi)聯(lián)函數(shù)雖然具有宏的展開特性,但其本質(zhì)仍是函數(shù),編譯器仍可以對其進行參數(shù)檢查,而宏就不具備這個功能。
- 在宏中的編譯錯誤很難發(fā)現(xiàn) ,因為它們引用的是擴展的代碼,而不是程序員鍵入的。
- 便于調(diào)試。 內(nèi)聯(lián)函數(shù)代碼的調(diào)試信息通常比擴展的宏代碼更有用,它同樣可以支持斷點、單步......等調(diào)試功能。
- 接口封裝。 有些內(nèi)聯(lián)函數(shù)可以用來封裝一個接口,而宏不具備這個特性。
四、總結(jié)
引入內(nèi)聯(lián)函數(shù)主要是解決一些頻繁調(diào)用的小函數(shù)造成額外時間開銷的問題,但是也要在符合一定內(nèi)聯(lián)函數(shù)的情況下使用。
使用很多的內(nèi)聯(lián)函數(shù),每個調(diào)用該函數(shù)的地方都需要替換成函數(shù)體,代碼量就會增加,代碼量就會增加也同時帶來了潛在的編譯時間的增加。
算法里面有個概念叫空間換時間,就是使用內(nèi)存占用更大的算法換取執(zhí)行速度的提升 ,所以說適當?shù)氖褂脙?nèi)聯(lián)函數(shù)可以提高程序的執(zhí)行效率。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4379瀏覽量
64739 -
代碼
+關(guān)注
關(guān)注
30文章
4899瀏覽量
70590 -
內(nèi)聯(lián)函數(shù)
+關(guān)注
關(guān)注
0文章
10瀏覽量
2332
發(fā)布評論請先 登錄
內(nèi)聯(lián)函數(shù)簡介
基于SUIF的函數(shù)內(nèi)聯(lián)技術(shù)
C++如何處理內(nèi)聯(lián)虛函數(shù)
內(nèi)聯(lián)函數(shù)詳解
內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)有什么區(qū)別

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

評論