C 內聯函式

2021-07-22 06:45:43 字數 1101 閱讀 8172

在c中,為了解決一些頻繁呼叫的小函式大量消耗棧空間或是叫棧記憶體的問題,特別的引入了inline修飾符,表示為內聯函式。

棧空間就是指放置程式的區域性資料也就是函式內資料的記憶體空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,函式的死迴圈遞迴呼叫的最終結果就是導致棧記憶體空間枯竭。

下面我們來看乙個例子

#include 

//函式定義為inline即:內聯函式

inline char* dbtest(int a)    

int main()  

}  

上面的例子就是標準的內聯函式的用法,使用inline修飾帶來的好處我們表面看不出來,其實在內部的工作就是在每個for迴圈的內部任何呼叫dbtest(i)的地方都換成了(i%2>0)?"奇":"偶"這樣就避免了頻繁呼叫函式對棧記憶體重複開闢所帶來的消耗。

inline的使用是有所限制的,inline只適合涵數體內**簡單的涵數使用,不能包含複雜的結構控制語句例如while、switch,並且不能內聯函式本身不能是直接遞迴函式(自己內部還呼叫自己的函式)。

補充:inline函式僅僅是乙個建議,對編譯器的建議,所以最後能否真正內聯,看編譯器的意思,它如果認為函式不複雜,能在呼叫點展開,就會真正內聯,並不是說宣告了內聯就會內聯,宣告內聯只是乙個建議而已.

其次,因為內聯函式要在呼叫點展開,所以編譯器必須隨處可見內聯函式的定義,要不然,就成了非內聯函式的呼叫了.所以,這要求每個呼叫了內聯函式的檔案都出現了該內聯函式的定義。

因此,將內聯函式放在標頭檔案裡實現是合適的,省卻你為每個檔案實現一次的麻煩.而所以宣告跟定義要一致,其實是指,如果在每個檔案裡都實現一次該內聯函式的話,那麼,最好保證每個定義都是一樣的,否則,將會引起未定義的行為,即是說,如果不是每個檔案裡的定義都一樣,那麼,編譯器展開的是哪乙個,那要看具體的編譯器而定.所以,最好將內聯函式定義放在標頭檔案中.

而類中的成員函式預設都是內聯的,如果在類定義時就在類內給出函式,那當然最好.如果在類中未給出成員函式定義,而又想內聯該函式的話,那在類外要加上inline,否則就認為不是內聯的.

為了方便,將內聯函式直接宣告時就定義,放在標頭檔案中.這樣其它檔案包含了該標頭檔案,就在每個檔案都出現了內聯函式的定義.就可以內聯了.

C 內聯函式

1 什麼是內聯函式?內聯函式就是小型函式,犧牲空間來節省函式呼叫的開銷,一般用作比較小的函式,即函式內部沒有迴圈 開關語句等。內聯函式被發明出來就是為了取代c中的巨集,因為巨集是單純的替換而沒有型別檢查所以經常出毛病,2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率...

C 內聯函式

1 什麼是內聯函式?2 為什麼要引入內聯函式?3 為什麼inline能取代巨集?4 內聯函式和巨集的區別?5 什麼時候用內聯函式?6 如何使用內聯函式?7 內聯函式的優缺點?8 如何禁止函式進行內聯?9 注意事項 1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內...

c 內聯函式

1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內。2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率問題。另外,前面我們講到了巨集,裡面有這麼乙個例子 define abs x x 0?x x 當 i出現時,巨集就會歪曲我們的意思...