轉自http://blog.csdn.net/lufeiop02/article/details/6526499函數
在c中,爲了解決一些頻繁調用的小函數大量消耗棧空間或是叫棧內存的問題,特別的引入了inline修飾符,表示爲內聯函數。
棧空間就是指放置程式的局部數據也就是函數內數據的內存空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會形成因棧空間不足所形成的程式出錯的問題,函數的死循環遞歸調用的最終結果就是致使棧內存空間枯竭。
下面咱們來看一個例子spa
#include <stdio.h> //函數定義爲inline即:內聯函數 inline char* dbtest(int a) { return (i % 2 > 0) ? "奇" : "偶"; } int main() { int i = 0; for (i=1; i < 100; i++) { printf("i:%d 奇偶性:%s /n", i, dbtest(i)); } }
上面的例子就是標準的內聯函數的用法,使用inline修飾帶來的好處咱們表面看不出來,其實在內部的工做就是在每一個for循環的內部任何調用dbtest(i)的地方都換成了(i%2>0)?"奇":"偶"這樣就避免了頻繁調用函數對棧內存重複開闢所帶來的消耗。
inline的使用是有所限制的,inline只適合涵數體內代碼簡單的涵數使用,不能包含複雜的結構控制語句例如while、switch,而且不能內聯函數自己不能是直接遞歸函數(本身內部還調用本身的函數)。
補充:.net
inline函數僅僅是一個建議,對編譯器的建議,因此最後可否真正內聯,看編譯器的意思,它若是認爲函數不復雜,能在調用點展開,就會真正內聯,並非說聲明瞭內聯就會內聯,聲明內聯只是一個建議而已.
其次,由於內聯函數要在調用點展開,因此編譯器必須隨處可見內聯函數的定義,要否則,就成了非內聯函數的調用了.因此,這要求每一個調用了內聯函數的文件都出現了該內聯函數的定義。code
所以,將內聯函數放在頭文件裏實現是合適的,省卻你爲每一個文件實現一次的麻煩.而因此聲明跟定義要一致,實際上是指,若是在每一個文件裏都實現一次該內聯函數的話,那麼,最好保證每一個定義都是同樣的,不然,將會引發未定義的行爲,便是說,若是不是每一個文件裏的定義都同樣,那麼,編譯器展開的是哪個,那要看具體的編譯器而定.因此,最好將內聯函數定義放在頭文件中.
而類中的成員函數缺省都是內聯的,若是在類定義時就在類內給出函數,那固然最好.若是在類中未給出成員函數定義,而又想內聯該函數的話,那在類外要加上inline,不然就認爲不是內聯的.blog
爲了方便,將內聯函數直接聲明時就定義,放在頭文件中.這樣其它文件包含了該頭文件,就在每一個文件都出現了內聯函數的定義.就能夠內聯了.遞歸