demo
//帶引數的巨集
#define myfunc(a, b) ((a) < (b) ? (a) : (b))
inline int myfunc(int a, int b)
int main1402()
說明1:
必須inline int myfunc(int a, int b)和函式體的實現,寫在一塊
說明2c++編譯器可以將乙個函式進行內聯編譯
被c++編譯器內聯編譯的函式叫做內聯函式
內聯函式在最終生成的**中是沒有定義的
c++編譯器直接將函式體插入在函式呼叫的地方
內聯函式沒有普通函式呼叫時的額外開銷(壓棧,跳轉,返回)
說明3:c++編譯器不一定准許函式的內聯請求!
說明4:
內聯函式是一種特殊的函式,具有普通函式的特徵(引數檢查,返回型別等)
內聯函式是對編譯器的一種請求,因此編譯器可能拒絕這種請求
內聯函式由 編譯器處理,直接將編譯後的函式體插入呼叫的地方
巨集**片段 由預處理器處理, 進行簡單的文字替換,沒有任何編譯過程
說明5:
現代c++編譯器能夠進行編譯優化,因此一些函式即使沒有inline宣告,也可能被編譯器內聯編譯
另外,一些現代c++編譯器提供了擴充套件語法,能夠對函式進行強制內聯
如:g++中的__attribute__((always_inline))屬性
說明6:
c++中內聯編譯的限制:
不能存在任何形式的迴圈語句
不能存在過多的條件判斷語句
函式體不能過於龐大
不能對函式進行取址操作
函式內聯宣告必須在呼叫語句之前
編譯器對於內聯函式的限制並不是絕對的,內聯函式相對於普通函式的優勢只是省去了函式呼叫時壓棧,跳轉和返回的開銷。
因此,當函式體的執行開銷遠大於壓棧,跳轉和返回所用的開銷時,那麼內聯將無意義。
結論:1)內聯函式在編譯時直接將函式體插入函式呼叫的地方
2)inline只是一種請求,編譯器不一定允許這種請求
3)內聯函式省去了普通函式呼叫時壓棧,跳轉和返回的開銷
inline 內聯函式
一 inline關鍵字用來定義乙個類的內聯函式,引入它的主要原因是用它替代c中表示式形式的巨集定義。表示式形式的巨集定義一例 define expressionname var1,var2 var1 var2 var1 var2 為什麼要取代這種形式呢,且聽我道來 1 首先談一下在c中使用這種形式巨...
inline內聯函式
技術類筆試題50 都會問巨集與inline的區別,自己去找找看?1 巨集替換發生在預編譯 2 巨集函式 如果可以這麼叫的話 替換時不會檢查引數,inline函式會檢查 3 巨集一定會發生替換,inline貌似不是強制的,編譯器想不替換也沒關係 4 巨集替換時存在著一些不可避免的陷阱 參見c trap...
inline內聯函式
一 內聯函式 內聯函式是指用inline關鍵字修飾的函式 它與普通函式所不同之處只在於函式呼叫的處理。普通 函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中 內聯函式不是在呼叫時發生執行權轉移,而是在編譯時將 函式 體 嵌入在每乙個呼叫處。編譯時類似巨集替換,使用 函式體替...