一、巨集定義和內聯函式的區別
1. 巨集定義不是函式,但是使用起來像函式。預處理器用複製巨集**的方式代替函式的呼叫,省去了函式壓棧退棧過程,提高了效率。
內聯函式本質上是乙個函式,內聯函式一般用於函式體的**比較簡單的函式,不能包含複雜的控制語句,while、switch,並且內聯函式本身不能直接呼叫自身。如果內聯函式的函式體過大,編譯器會自動的把這個內聯函式變成普通函式。
2. 巨集定義是在預編譯的時候把所有的巨集名用巨集體來替換,簡單的說就是字串替換
內聯函式則是在編譯的時候進行**插入,編譯器會在每處呼叫內聯函式的地方直接把內聯函式的內容展開,這樣可以省去函式的呼叫的開銷,提高效率
3. 巨集定義是沒有型別檢查的,無論對還是錯都是直接替換
內聯函式在編譯的時候會進行型別的檢查,內聯函式滿足函式的性質,比如有返回值、引數列表等
4. 巨集定義和內聯函式使用的時候都是進行**展開。不同的是巨集定義是在預編譯的時候把所有的巨集名替換,內聯函式則是在編譯階段把所有呼叫內聯函式的地方把內聯函式插入。這樣可以省去函式壓棧退棧,提高了效率
二、內聯函式和普通函式的區別
1. 內聯函式和普通函式的引數傳遞機制相同,但是編譯器會在每處呼叫內聯函式的地方將內聯函式內容展開,這樣既避免了函式呼叫的開銷又沒有巨集機制的缺陷
2. 普通函式在被呼叫的時候,系統首先要到函式的入口位址去執行函式體,執行完成之後再回到函式呼叫的地方繼續執行,函式始終只有乙個複製。
內聯函式不需要定址,當執行到內聯函式的時候,將此函式展開,如果程式中有n次呼叫了內聯函式則會有n次展開函式**
3. 內聯函式有一定的限制,內聯函式體要求**簡單,不能包含複雜的結構控制語句。如果內聯函式函式體過於複雜,編譯器將自動把內聯函式當成普通函式來執行
內聯函式與巨集定義
用內聯取代巨集 1.內聯可除錯 2.可進行型別安全檢查或自動型別轉換 3.可訪問成員變數。另外,定義在類宣告中的成員函式自動轉化為內聯函式。內聯函式與巨集定義 在c中,常用預處理語句 define來代替乙個函式定義。例如 define max a,b a b a b 該語句使得程式中每個出現max ...
內聯函式與巨集定義
1 內聯函式取消了引數的壓棧,減少呼叫的開銷 2 內聯函式宣告必須和定義一起,如果只有宣告,編譯器只會將它看做普通函式的宣告,如果宣告的時候使用inline,定義在其他地方也用inline,那麼它是內聯還是普通函式 普通函式。查彙編 內聯函式與普通函式一樣?3 c 類中定義的函式都預設是內聯函式,無...
巨集定義與內聯函式
1 巨集定義的規則和使用解析 1 巨集定義的解析規則就是 在預處理階段由預處理器進行替換,這個替換是原封不動的替換。2 巨集定義替換會遞迴進行,直到替換出來的值本身不再是乙個巨集為止。3 乙個正確的巨集定義式子本身分為3部分 第一部分是 dedine 第二部分是巨集名 剩下的所有為第三部分。4 巨集...