定義:內聯函數從源代碼層看,有函數的結構,而在編譯后,卻不具有函數的性質。內聯函數不是在調用時產生控制轉移,而是在編譯時將函數體嵌入在每個調用途。編譯時,類似宏替換,使用函數體替換調用途的函數名。1般在代碼中用inline修飾,但是能否構成內聯函數,需要看編譯器對該函數定義的具體處理。
C++中的const常量可以替換宏常數定義,如:
C++中推薦使用內聯函數替換宏代碼片斷。
C++中使用inline關鍵字聲明內聯函數。內聯函數聲明時inline關鍵字必須和函數定義結合在1起,否則編譯器會直接疏忽內聯要求。
說明1:
必須inline int myfunc(inta, int b)和實現的地方,寫在1塊。說明2:
C++編譯器可以將1個函數進行內聯編譯,被C++編譯器內聯編譯的函數叫做內聯函數;
內聯函數在終究生成的代碼中是沒有定義的;
C++編譯器直接將函數體插入函數調用的地方;
內聯函數沒有普通函數調用時的額外開消(壓棧,跳轉,返回)。說明3:
C++編譯器不1定準予函數的內聯要求!
說明4:
內聯函數是1種特殊的函數,具有普通函數的特點(參數檢查,返回類型等)。
內聯函數是對編譯器的1種要求,因此編譯器可能謝絕這類要求。
內聯函數由編譯器處理,直接將編譯后的函數體插入調用的地方。
宏代碼片斷由預處理器處理,進行簡單的文本替換,沒有任何編譯進程。說明5:
現代C++編譯器能夠進行編譯優化,因此1些函數即便沒有inline聲明,也可能被編譯器內聯編譯。
另外,1些現代C++編譯器提供了擴大語法,能夠對函數進行強迫內聯如:g++中的__attribute__((always_inline))屬性。
說明6:
C++中內聯編譯的限制:
不能存在任何情勢的循環語句 ;
不能存在過量的條件判斷語句;
函數體不能過于龐大;
不能對函數進行取址操作;
函數內聯聲明必須在調用語句之前;編譯器對內聯函數的限制其實不是絕對的,內聯函數相對普通函數的優勢只是省去了函數調用時壓棧,跳轉和返回的開消。因此,當函數體的履行開消遠大于壓棧,跳轉和返回所用的開消時,那末內聯將無意義。
結論:
1)內聯函數在編譯時直接將函數體插入函數調用的地方。
2)inline只是1種要求,編譯器不1定允許這類要求。
3)內聯函數省去了普通函數調用時壓棧,跳轉和返回的開消。C++中可以在函數聲明時為參數提供1個默許值,當函數調用時沒有指定這個參數的值,編譯器會自動用默許值代替。
函數默許參數的規則:
只有參數列表后臉部分的參數才可以提供默許參數值。
1旦在1個函數調用中開始使用默許參數值,那末這個參數后的所有參數都必須使用默許參數值。
占位參數只有參數類型聲明,而沒有參數名聲明,1般情況下,在函數體內部沒法使用占位參數。