關於c中的inline

2021-10-07 06:09:23 字數 1008 閱讀 8125

在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中的inline

在c中,為了解決一些頻繁呼叫的小函式大量消耗棧空間或是叫棧記憶體的問題,特別的引入了inline修飾符,表示為內聯函式。棧空間就是指放置程式的區域性資料也就是函式內資料的記憶體空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,函式的死迴圈遞迴呼叫的最終結果...

關於C 中的內聯函式 inline

在c 中,為了解決一些頻繁呼叫的小函式大量消耗棧空間或者是叫棧記憶體的問題,特別的引入了inline修飾符,表示為內聯函式。可能說到這裡,很多人還不明白什麼是棧空間,其實棧空間就是指放置程式的區域性資料也就是函式內資料的記憶體空間 在系統下,棧空間是有限的,如果頻繁大量的使用就會造成因棧空間不足所造...

關於C 中的內聯函式 inline

在c 中,為了解決一些頻繁呼叫的小函式大量消耗棧空間或者是叫棧記憶體的問題,特別的引入了inline修飾符,表示為內聯函式。可能說到這裡,很多人還不明白什麼是棧空間,其實 棧空間就是指放置程式的區域性資料也就是函式內資料的記憶體空間,在系統下,棧空間是有限的,如果頻繁大量的使用就會造成因棧空間不足所...