在c中,為了解決一些頻繁呼叫的小函式大量消耗棧空間或是叫棧記憶體的問題,特別的引入了inline修飾符,表示為內聯函式。
棧空間就是指放置程式的區域性資料也就是函式內資料的記憶體空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,函式的死迴圈遞迴呼叫的最終結果就是導致棧記憶體空間枯竭。
下面我們來看乙個例子
[c-sharp]
view plain
copy
#include
//函式定義為inline即:內聯函式
inline
char
* dbtest(
inta)
intmain() }
上面的例子就是標準的內聯函式的用法,使用inline修飾帶來的好處我們表面看不出來,其實在內部的工作就是在每個for迴圈的內部任何呼叫dbtest(i)的地方都換成了(i%2>0)?"奇":"偶"這樣就避免了頻繁呼叫函式對棧記憶體重複開闢所帶來的消耗。
inline的使用是有所限制的,inline只適合涵數體內**簡單的涵數使用,不能包含複雜的結構控制語句例如while、switch,並且不能內聯函式本身不能是直接遞迴函式(自己內部還呼叫自己的函式)。
補充:inline函式僅僅是乙個建議,對編譯器的建議,所以最後能否真正內聯,看編譯器的意思,它如果認為函式不複雜,能在呼叫點展開,就會真正內聯,並不是說宣告了內聯就會內聯,宣告內聯只是乙個建議而已.
其次,因為內聯函式要在呼叫點展開,所以編譯器必須隨處可見內聯函式的定義,要不然,就成了非內聯函式的呼叫了.所以,這要求每個呼叫了內聯函式的檔案都出現了該內聯函式的定義。
因此,將內聯函式放在標頭檔案裡實現是合適的,省卻你為每個檔案實現一次的麻煩.而所以宣告跟定義要一致,其實是指,如果在每個檔案裡都實現一次該內聯函式的話,那麼,最好保證每個定義都是一樣的,否則,將會引起未定義的行為,即是說,如果不是每個檔案裡的定義都一樣,那麼,編譯器展開的是哪乙個,那要看具體的編譯器而定.所以,最好將內聯函式定義放在標頭檔案中.
而類中的成員函式預設都是內聯的,如果在類定義時就在類內給出函式,那當然最好.如果在類中未給出成員函式定義,而又想內聯該函式的話,那在類外要加上inline,否則就認為不是內聯的.
為了方便,將內聯函式直接宣告時就定義,放在標頭檔案中.這樣其它檔案包含了該標頭檔案,就在每個檔案都出現了內聯函式的定義.就可以內聯了.
c語言中inline函式
發表於2011 年 01 月 26 日 由admin c c 中的inline,使用在函式宣告處,表示程式設計師請求編譯器在此函式的被呼叫處將此函式實現插入,而不是像普通函式那樣生成呼叫 申請是否有效取決於編譯器 一般地說,這樣作的優點是省掉了呼叫函式的開銷 缺點則是可能會增加代所生成目標 的尺寸 ...
c語言中的的內聯 inline 函式
發表於2011 年 01 月 26 日 由 admin c c 中的inline,使用在函式宣告處,表示程式設計師請求編譯器在此函式的被呼叫處將此函式實現插入,而不是像普通函式那樣生成呼叫 申請是否有效取決於編譯器 一般地說,這樣作的優點是省掉了呼叫函式的開銷 缺點則是可能會增加代所生成目標 的尺寸...
c語言中的的內聯 inline 函式
c c 中的inline,使用在函式宣告處,表示程式設計師請求編譯器在此函式的被呼叫處將此函式實現插入,而不是像普通函式那樣生成呼叫 申請是否有效取決於編譯器 一般地說,這樣作的優點是省掉了呼叫函式的開銷 缺點則是可能會增加代所生成目標 的尺寸 二班的除外,二班情況下,inline函式甚至會返過來降...