------/內聯函式
c++推薦使用內聯函式替代巨集**片段,inline必須與函式定義放一起
c++編譯器可將某函式內聯編譯,被內聯編譯的函式稱內聯函式,最終生成的**無內聯函式的定義,編譯器直接將函式體插入函式呼叫的地方,內聯函式無普通函式呼叫時的額外開銷(壓棧,跳轉,返回),編譯器不一定准許函式的內聯請求
內聯函式是一種特殊的函式,具有普通函式的特徵(引數檢查,返回型別等),內聯函式由編譯器處理,直接將編譯後的函式體插入呼叫的地方
巨集**片段由預處理器處理,為簡單文字替換,無編譯過程
現代c++編譯器能夠進行編譯優化,因此一些函式即使沒有inline宣告,也可能被編譯為內聯編譯,另外一些現代c++編譯器提供了擴充套件語法,能夠對函式進行強制內聯
如:g++中的__attribute__((always_inline))屬性
g++
-s 檔名
//單步編譯為彙編檔案
inline int f_inline(int a, int b)
//並未使其成為內聯函式
int f_inline(int a, int b) __attribute__((always_inline));
//成為內聯函式
inline int f_inline(int a, int b)
c++中內聯編譯的限制:
不能存在任何形式迴圈語句,不能存在過多條件判斷語句,函式體不能過於龐大,不能對函式名進行取址操作,否則均拒絕內聯編譯
編譯器對於內聯函式的限制並非絕對,內聯函式相對於普通函式優勢僅省去了函式呼叫時壓棧、跳轉和返回的開銷,因此當函式體執行開銷遠大於壓棧等開銷時,內聯將無意義
------/函式預設引數
c++中可在函式宣告時為引數提供一預設值,當函式呼叫時沒指定該引數的值,則編譯器用預設值代替
int mul(int x = 3);
int mul(int x)
只有引數列表後面部分引數才可以提供預設引數值
一旦呼叫開始使用預設引數值,則該引數後所有引數都須使用預設引數值(對應)
int add(int a, int b = 0, int c=0)
int main(int argc, char *argv)
------/函式佔位引數
在c++中可為函式提供佔位引數,佔位引數只有型別宣告,而無引數名,在函式體內部也無法使用佔位引數
int func(int a, int b, int)
printf("func(1, 2, 3) = %d\n", func(1, 2, 3));
//3可以將佔位引數與預設引數結合起來使用,為以後程式擴充套件留下線索
int func(int a, int b, int = 0)
printf("func(1, 2, 3) = %d\n", func(1, 2,3));
------/總結
c++中可通過inline宣告內聯函式
內聯函式在編譯時直接將函式體插入函式呼叫地方
inline只是一種請求,編譯器不一定允許這種請求
內聯函式省去了普通函式呼叫時壓棧、跳轉和返回等開銷
c++在宣告函式時可指定引數預設值
c++可宣告佔位符引數,佔位符引數一般用於程式擴充套件和對c**的相容
C 函式的預設引數和佔位引數
預設引數 引數的預設值,定義乙個函式,可以為引數列表中每乙個引數指定預設值。當呼叫函式時,如果實際引數的值留空,則使用這個預設值,需要注意的是不可以跳過預設引數,因為是位置引數。預設引數後的所有引數都必須設定預設值。函式宣告和函式定義分開寫時 不能同時設定預設引數 分檔案時,定義處的預設引數無效,僅...
C 內聯函式 函式過載與函式預設引數
inline int max int a,int b int max double f1,double f2 int max int n1,int n2 int max int n1,int n2,int n3 max 3.4,2.5 呼叫 1 max 2,4 呼叫 2 max 1,2,3 呼叫 3...
Day13 預設函式引數,佔位引數,函式過載
day13.2021.11.23 一旦開始有預設值,後面必須都要有預設值 include methodstate.h int func int a,int b 20,int c 30 一旦開始有預設值,後面必須都要有預設值 int func int a,int b 20,int c c 必須賦值 i...