帶參巨集即為帶有引數的巨集定義,要注意的是,在書寫帶參巨集時一定要給每乙個引數帶括號,並給表示式整體帶括號。如求a,b中較大者:
#define max(a,b) (((a)>(b))?(a):(b))
眾所周知,巨集定義是在預處理階段由預處理器對所定義的巨集進行原地展開的,而預處理器是不帶引數檢驗功能的,所以帶參巨集無法對其引數進行校驗,這是它的乙個缺陷。同時對它的處理是原地替換,所以不存在傳參,也就免去了傳參時的資源排程,提高了執行效率,這是它的乙個優點。
而對函式的處理是在編譯階段由編譯器進行的,編譯器帶有引數檢驗功能,可以對函式的引數進行型別靜態校驗,避免傳參錯誤,與帶參巨集相比,這是函式的乙個優點。同時,函式傳參時需要排程資源,降低了程式的執行效率,這是它的乙個缺點。
內聯函式是通過在函式定義時在函式返回值型別前加inline關鍵字來實現的,在編譯階段,編譯器會在呼叫內聯函式處直接將inline函式原地展開,不存在傳參。可見內聯函式就結合了函式和帶參巨集二者的優點與一身,即提高了效率,又具有引數檢驗。
注意inline關鍵字只是建議編譯器將該函式當做內聯函式來處理,當函式體很短時,編譯器會考慮其建議,直接將inline函式在呼叫處原地展開,但當函式體很長,直接展開很費勁時,編譯器就不會接受inline關鍵字的建議,依然將該函式當做普通函式來處理,這時候雖然函式有inline關鍵字修飾但不會被在呼叫處原地展開。
函式形參 內聯函式
1.形參帶預設值的函式 1.給預設值,需要從右向左給,壓棧的時候從右向左壓。int sum int a 10,int b 這樣是錯誤的2.給預設值呼叫效率高 因為呼叫時給值,h彙編會直接壓棧,如果是給變數值,還需要多一條move指令,需要從記憶體中取值到暫存器,再壓棧。3.定義可以給形參預設值,宣告...
內聯函式和巨集函式
黑色印記 內聯函式和普通函式相比可以加快程式執行的速度,因為不需要中斷呼叫及返回的過程。在編譯階段內聯函式可以直接被鑲嵌到目標 中。而巨集只是乙個簡單地替換。內聯函式的優勢在於做引數型別檢查,而巨集定義不會。我們知道內聯函式和巨集定義是犧牲記憶體空間換取執行效率的。因此,是否使用內聯函式就要根據實際...
內聯函式和巨集函式
內聯函式和普通函式的區別 普通函式呼叫時是生成呼叫指令跳轉 然後當 執行到呼叫位置時,跳轉到函式所在的 段中執行 而 內聯函式就是直接把函式編譯好的二進位制指令複製到函式的呼叫位置 優點 提高了程式的執行速度 沒跳轉沒返回當然速度快了 但這樣會導致可執行檔案增大 冗餘 也就是犧牲空間來換取時間 顯式...