C 對C的函式擴充套件 inline內聯函式

2021-08-14 11:30:00 字數 1569 閱讀 1533

1、c++中的const常量可以替代巨集常數定義,如:

const int a = 3;  #define a 3

2、c++中是否有解決方案替代巨集**片段呢?(替代巨集**片段就可以避免巨集的***!)

c++中推薦使用內聯函式替代巨集**片段

c++中使用inline關鍵字宣告內聯函式

說明1:

inline

必須和函式體的實現,寫在一塊

說明2

c++編譯器可以將乙個函式進行內聯編譯

被c++編譯器內聯編譯的函式叫做內聯函式

內聯函式在最終生成的**中是沒有定義的

c++編譯器直接將函式體插入在函式呼叫的地方

內聯函式沒有普通函式呼叫時的額外開銷(壓棧,跳轉,返回)

說明3:

c++編譯器不一定准許函式的內聯請求!

說明4

內聯函式是一種特殊的函式,具有普通函式的特徵(引數檢查,返回型別等)

內聯函式是對編譯器的一種請求,因此編譯器可能拒絕這種請求

內聯函式由 編譯器處理,直接將編譯後的函式體插入呼叫的地方

巨集**片段 由預處理器處理, 進行簡單的文字替換,沒有任何編譯過程

說明5:

現代c++編譯器能夠進行編譯優化,因此一些函式即使沒有inline宣告,也可能被編譯器內聯編譯

另外,一些現代c++編譯器提供了擴充套件語法,能夠對函式進行強制內聯如:g++中的__attribute__((always_inline))屬性

說明6 (c++中內聯編譯的限制):

1)函式內聯宣告必須在呼叫語句之前 2

)不能存在任何形式的 迴圈語句、 函式取址操作 3

)不能存在過多的條件判斷語句 4

)函式體不能過於龐大 5)

編譯器對於內聯函式的限制並不是絕對的,內聯函式相對於普通函式的優勢只是省去了函式呼叫時壓棧,跳轉和返回的開銷。因此,當函式體的執行開銷遠大於壓棧,跳轉和返回所用的開銷時,那麼內聯將無意義。

結論

1)內聯函式在編譯時直接將函式體插入函式呼叫的地方

2)inline只是一種請求,編譯器不一定允許這種請求

3)內聯函式省去了普通函式呼叫時壓棧,跳轉和返回的開銷

#include "iostream"

using namespace std;

//短小精悍的函式適合定義成內聯函式

//inline必須和函式體的實現,寫在一塊

//單獨宣告inline void printa()是錯誤的

inline void printa()

void main01()

//inline和#define的區別

#define myfunc(a, b) ((a) < (b) ? (a) : (b))

inline int myfunc(int a, int b)

int main()

inline函式 C 內聯函式 inline

inline要起作用,必須要與函式定義放在一起,而不是函式的宣告 inline 當編譯器處理呼叫內聯函式的語句時,不會將該語句編譯成函式呼叫的指令,而是直接將整個函式體的 插人呼叫語句處,就像整個函式體在呼叫處被重寫了一遍一樣,在執行時是順序執行,而不會進行跳轉。優點 內聯函式沒有執行函式呼叫的開銷...

C 對C的擴充套件

1.c 會對函式返回值型別和引數個數進行檢測 c語言預設為返回值為int,引數個數不做檢查 2.c 在定義結構體變數時,關鍵字struct可以省略,結構體名不能省 3.在全域性中定義 int val g bss段 全是0 在全域性中 int val g 20 data c正確 2是賦值 c 錯誤 重...

C 對C的擴充套件

c 是c語言的加強,是一種更好的c語言 c 是以c語言為基礎的,並且完全相容c語言的特性 c語言 物件導向方 objective c c c 以c語言為基礎 物件導向支援 型別加強 函式加強 異常處理 標準格式 namespace namec中的命名空間 在c語言中只有乙個全域性作用域 c語言中所有...