c 行內函數和普通函式的區別

時間 2021-05-14 08:37:13

1樓:八哥說科技

1、編譯結果不同:

2、編譯的時間不同:

對於基於c的編譯系統,行內函數的使用可能大大增加編譯時間,因為每個呼叫該函式的地方都需要替換成函式體,**量的增加也同時帶來了潛在的編譯時間的增加。

3、執行的效率不同:

使用行內函數時,必須在程式佔用空間和程式執行效率之間進行權衡,因為過多的比較複雜的函式進行內聯擴充套件將帶來很大的儲存資源開支。

2樓:匿名使用者

行內函數是一種以空間換取時間的機制,提高時間效率,一般**少,無迴圈,無遞迴的函式才考慮使用!

3樓:醉棋

行內函數在編譯層面類似於巨集替換。也就是說,程式執行過程中呼叫行內函數不需要入棧出棧,所以效率會提高。

4樓:飛翔的菜菜

沒有區別,只是加一個inline關鍵字而已,如果說是區別,就是說它是包含在類裡面的,雖然在外面定義,如果沒有inline關鍵字,那就是在外部的函式,不屬於這個類

5樓:程式設計師聚集地

只有三二行的**,建議使用內聯!

這樣執行速度會很快,因為加入了inline 可以減少了,跳入函式和跳出函式的步驟!

如果一個非常複雜的函式使用了inline 效果和沒有使用內聯一樣。。。

inline只是針對比較簡單的函式,建議使用!

6樓:麒麒燕

使用函式能夠避免將相同**重寫多次的麻煩,還能減少可執行程式的體積,但也會帶來程式執行時間上的開銷。

函式呼叫在執行時,首先要在棧中為形參和區域性變數分配儲存空間,然後還要將實參的值複製給形參,接下來還要將函式的返回地址(該地址指明瞭函式執行結束後,程式應該回到**繼續執行)放入棧中,最後才跳轉到函式內部執行。這個過程是要耗費時間的。

另外,函式執行 return 語句返回時,需要從棧中**形參和區域性變數佔用的儲存空間,然後從棧中取出返回地址,再跳轉到該地址繼續執行,這個過程也要耗費時間。

總之,使用函式呼叫語句和直接把函式中的**重新抄寫一遍相比,節省了人力,但是帶來了程式執行時間上的額外開銷。

一般情況下,這個開銷可以忽略不計。但是,如果一個函式內部沒有幾條語句,執行時間本來就非常短,那麼這個函式呼叫產生的額外開銷和函式本身執行的時間相比,就顯得不能忽略了。假如這樣的函式在一個迴圈中被上千萬次地執行,函式呼叫導致的時間開銷可能就會使得程式執行明顯變慢。

作為特別注重程式執行效率,適合編寫底層系統軟體的高階程式設計語言,c++ 用 inline 關鍵字較好地解決了函式呼叫開銷的問題。

在 c++ 中,可以在定義函式時,在返回值型別前面加上 inline 關鍵字。如:

inline int max (int a, int b)

增加了 inline 關鍵字的函式稱為“行內函數”。行內函數和普通函式的區別在於:當編譯器處理呼叫行內函數的語句時,不會將該語句編譯成函式呼叫的指令,而是直接將整個函式體的**插人呼叫語句處,就像整個函式體在呼叫處被重寫了一遍一樣。

有了行內函數,就能像呼叫一個函式那樣方便地重複使用一段**,而不需要付出執行函式呼叫的額外開銷。很顯然,使用行內函數會使最終可執行程式的體積增加。以時間換取空間,或增加空間消耗來節省時間,這是計算機學科中常用的方法。

行內函數中的**應該只是很簡單、執行很快的幾條語句。如果一個函式較為複雜,它執行的時間可能上萬倍於函式呼叫的額外開銷,那麼將其作為行內函數處理的結果是付出讓**體積增加不少的代價,卻只使速度提高了萬分之一,這顯然是不划算的。

有時函式看上去很簡單,例如只有一個包含一兩條語句的迴圈,但該迴圈的執行次數可能很多,要消耗大量時間,那麼這種情況也不適合將其實現為行內函數。

另外,需要注意的是,呼叫行內函數的語句前必須已經出現行內函數的定義(即整個數體),而不能只出現行內函數的宣告。

7樓:tn瓶邪

行內函數定義:

將函式定義為行內函數,一般就是將他在程式中每個呼叫點上“內聯地”。在函式返回型別前加上inline關鍵字。

定義在類宣告之中的成員函式將自動地成為行內函數。

行內函數適用情況:

1.一個函式被重複呼叫;

2.函式只有幾行,且不包含for,while,switch語句。

行內函數應該放在標頭檔案中定義,這一點不同於其他函式。

8樓:流行狼月

void myprintf(int a)

int main()

對於這個函式,在進行反覆的列印3的過程中我們是不是要反覆的呼叫myprintf(int a)這個函式,進函式和出函式是需要時間的,假設這個過程用時為4ms,而執行printf這個操作只需要2ms,那麼在100次迴圈的過程中進出函式的時間比函式功能printf需要的時間還要長,這樣很影響工作效率。於是,我們就想要如何去免去進出函式的過程呢?那麼就可以宣告inline這個關鍵字,有何用途?

當我們宣告瞭一個inline的函式時候,函式被呼叫的語句就被替換成了函式本身,進行了一個預處理

int main()

return 0;

}這樣一來我就非常明顯的知道這個函式是幹什麼的了,就不需要去呼叫函式的定義部分,再通俗點講,原來我要從家裡去外面的商店去買冰淇淋(來回需要時間),現在商店就在我家裡面了,那麼我是不是省去了去商店的時間呢?但是相應的我這個家要很大(也就是所謂的空間要很大才能包含這個商店對吧?)這樣就是用空間去換取了時間了,相信你已經明白了。

函式能否即是虛函式又是內聯函式,乙個函式能否即是虛函式又是內聯函式?

她是我的小太陽 通常,乙個內聯函式是被的。class cfoo int setval int v 這裡,如果使用下列 cfoo x x.setval 17 int y x.getval 那麼編譯器產生的目標 將與下面的 段一樣 cfoo x x.val 17 int y x.val 虛函式有多型性,...

隱函式和顯函式的區別

薄夢寒撒貝 顯函式和隱函式沒有什麼嚴格的定義,就是從形式上分,能有y f x 這種顯式表示的就是顯函式 否則是隱函式。 明日等你 如果方程f x,y 0能確定y與x的對應關係,那麼稱這種表示方法表示的函式為隱函式。隱函式不一定能寫為y f x 的形式,如x 2 y 2 0。因此按照函式 設x和y是兩...

c 中的析構函式與建構函式的區別

c 中的析構函式與建構函式的區別主要是功能上的區別 建構函式 是一種特殊的方法。主要用來在建立物件時初始化物件,即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。特別的乙個類可以有多個建構函式 可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的過載。析構函式 dest...