【c++深度剖析學習總結】 6 內聯函式分析
1.c++中的const常量可以替代巨集常數定義,如:
const int a = 3; #define a 3
c++中是否有解決方案替代巨集**片段呢?
有,內聯函式
2.內聯函式
c++中推薦使用內聯函式替代巨集**片段
c++中使用inline關鍵字宣告內聯函式
inline
intfunc
(int a,
int b)
內聯函式宣告時inline關鍵字必須和函式定義結合在一起,否則編譯器會直接忽略內聯請求。c++編譯器可以將乙個函式進行內聯編譯
被c++編譯器內聯編譯的函式叫做內聯函式
c++編譯器直接將函式體插入函式呼叫的地方
內聯函式沒有普通函式呼叫時的額外開銷(壓棧,跳轉,返回)
c++編譯器不一定滿足函式的內聯請求
實驗1 內聯函式
#include
#define func(a, b) ((a) < (b) ? (a) : (b))
inline
intfunc
(int a,
int b)
intmain
(int argc,
char
*ar**)
直接執行結果:**的是2 3 2問題是巨集**塊是有***的,可以使用內聯函式
這個時候使用vs的反彙編功能
轉到反彙編
從反彙編可見,實際是沒有同意請求的內聯函式修改方式:這個是可以在軟體內修改的
內聯函式具有普通函式的特徵(引數檢查,返回型別等)
函式的內聯請求可能被編譯器拒絕
函式被內聯編譯後,函式體直接擴充套件到呼叫的地方
**注意:**巨集**片段由預處理器處理,進行簡單的文字替換,沒有任何編譯過程,因此可能出現***。
現代c++編譯器能夠進行編譯優化,一些函式即使沒有inline宣告,也可能被內聯編譯
一些現代c++編譯器提供了擴充套件語法,能夠對函式進行強制內聯,如:
g++
:_attribute_
((always_inline)
)屬性msvc:_forceinline
6-2 內聯函式示例
#include
//__forceinline
//__attribute__((always_inline))
inline
intadd_inline
(int n)
;int
main
(int argc,
char
*ar**)
inline
intadd_inline
(int n)
return ret;}/*
r = 45
*/
3.注意事項c++中inline內聯編譯的限制
不能存在任何形式的迴圈語句
不能存在過多的條件判斷語句
函式體不能過於龐大
不能對函式進行取值操作
函式內聯宣告必須在呼叫語句之前
小結
c++中可以通過inline宣告內聯函式
編譯器直接將內聯函式體擴充套件到函式呼叫的地方
inline只是一種請求,編譯器不一定允許這種請求
內聯函式省去了函式呼叫時壓棧,跳轉和返回的開銷
C 學習記錄6 內聯函式分析
c 中const常量可以代替巨集常數定義 使用內聯函式替代巨集 片段。c 中標推薦使用內聯函式代替巨集 片段。c 中使用inline關鍵字宣告內聯函式。內聯函式宣告時inline關鍵字必須和函式定義結合在一起,否則編譯器會直接忽略內聯請求。函式呼叫時,會有引數入棧 函式返回 棧變數的銷毀等等的開銷,...
C 第6課 內聯函式分析
本文學習自 狄泰軟體學院 唐佐林老師的 c 課程 引入 c 內聯函式的引入是為了替換c中巨集 塊功能 實驗1 巨集 塊 vs 內聯函式 注意 在c 開發中首選內聯函式定義 塊,而不是巨集實驗2 強制內聯 c語言中的巨集常量只是在預處理期間進行鍵的文字替換,它的 是並不會進行任何的語法檢查,型別檢查。...
第6課 內聯函式分析
帶參函式巨集內聯函式 優點編譯器會做引數的靜態型別檢查 原地展開,沒有呼叫開銷 並且在預處理階段完成,不占用編譯時間。函式 被裝入符號表中,在使用時進行替換 沒有呼叫開銷,效率高,會進行引數型別檢查 缺點需要傳參 棧變數的開闢和銷毀 壓棧 跳轉 返回開銷 不進行型別檢查,多次巨集替換會導致 體積變大...