c++中const常量可以代替巨集常數定義;使用內聯函式替代巨集**片段。
c++中標推薦使用內聯函式代替巨集**片段。
c++中使用inline關鍵字宣告內聯函式。
內聯函式宣告時inline關鍵字必須和函式定義結合在一起,否則編譯器會直接忽略內聯請求。
函式呼叫時,會有引數入棧、函式返回、棧變數的銷毀等等的開銷,而巨集**塊則沒有。(內聯函式取兩者的優點)
內聯函式的表現形式和普通函式是一樣的,但是會被編譯器進行優化。將內聯函式的函式體進行擴充套件(不是文字替換,不是預處理器完成),是由編譯器直接將編譯生成的**進行拓展,到呼叫內聯函式的地方,即可進行引數檢查等工作。
關鍵字inline
是對編譯器的一種請求,對函式體的內容進行內聯編譯。請求是否成功不一定。
c++編譯器可以將乙個函式進行內聯編譯。編譯器直接將內聯函式的函式體拓展到函式呼叫的地方。內聯函式沒有普通函式呼叫時的額外開銷(壓棧、跳轉、返回)。
內聯函式特點: 1
)內聯函式具有普通函式的特徵(引數檢查,返回型別等); 2
)函式的內聯請求可能被編譯器拒絕; 3
)函式被內聯編譯後,函式體直接拓展到呼叫的地方;
巨集**片段由預處理器處理,進行簡單的文字替換,沒有任何編譯過程,因此可能出現***。
(在c++
開發中,首選內聯函式)
為什麼內聯請求會被拒絕? 現代
c++編譯器能夠進行編譯優化,一些函式即使沒有
inline
,也可能內聯編譯。
一些現代
c++編譯器提供了拓展語法,能夠對函式進行
強制內聯
,如:
上圖所示為關鍵字,代替
inline
使用。
程式示例
:
#include //__forceinline
//__attribute__((always_inline))
inline
int add_inline(int n);
int main(int argc, char *argv)
inline int add_inline(int n)
{ int ret = 0;
for(int i=0; i注意事項:(
c++中
inline內聯編譯的限制)(對於現在來講大多數已經不是問題)
1)不能存在任何形式的迴圈語句;
2)不能存在過多的條件判斷語句;
3)函式體不能過於龐大;
4)不能對函式進行取址操作;
5)函式內聯宣告必須在呼叫語句之前。
C 深度剖析學習總結 6 內聯函式分析
c 深度剖析學習總結 6 內聯函式分析 1.c 中的const常量可以替代巨集常數定義,如 const int a 3 define a 3 c 中是否有解決方案替代巨集 片段呢?有,內聯函式 2.內聯函式 c 中推薦使用內聯函式替代巨集 片段 c 中使用inline關鍵字宣告內聯函式 inline...
內聯函式分析
1 內聯函式 1 c 中 const 可以代替巨集常量定義。如 const int a 3 define a 3 既然const 可以代替 巨集常量 的定義 是否有其他辦法代替 巨集 呢?有,內聯函式。2 內聯函式。1 c 中推薦使用內聯函式代替巨集 片段。2 c 中使用 inline 關鍵字宣告內...
C 第6課 內聯函式分析
本文學習自 狄泰軟體學院 唐佐林老師的 c 課程 引入 c 內聯函式的引入是為了替換c中巨集 塊功能 實驗1 巨集 塊 vs 內聯函式 注意 在c 開發中首選內聯函式定義 塊,而不是巨集實驗2 強制內聯 c語言中的巨集常量只是在預處理期間進行鍵的文字替換,它的 是並不會進行任何的語法檢查,型別檢查。...