c inline和 define巨集的區別

2021-10-04 02:09:06 字數 1218 閱讀 5501

1. 為什麼要是用巨集定義

對比與一般的呼叫函式:因為呼叫巨集比呼叫函式更有效率,函式的呼叫必須要將程式的執行順序轉移到函式所存放的記憶體位址中,將函式程式內容執行完後,再返回到執行該函式前的地方,這種轉移操作要求執行前要儲存現場並記憶執行位址,轉回後要恢復現場,並按原來儲存的位址繼續執行,因此,函式呼叫有一定的時間和空間的開銷,而巨集只是在預處理的地方把**展開,不需要額外的時間和空間開銷,所以呼叫乙個巨集比呼叫乙個函式更有效率。

2. 巨集定義的最大好處

巨集定義使用上像乙個函式,但不是函式。它使用預處理器實現,沒有了引數壓棧、**生成等一系列操作,因此效率很高。

3. 巨集定義的缺點

雖然巨集定義類似乙個函式,但在使用時,僅僅只是做預處理器符號表中的簡單替換,因此它不能進行引數有效性的檢測,也就不能享受c++編譯器嚴格型別檢查的好處,另外它的返回值也就不能被強制轉換為可轉換的合適型別。

巨集定義不能訪問類的成員變數。

巨集定義使用引數時,是嚴格的替換策略,無論你得引數時是何種形式,在展開**中都是用形引數代替實參,這樣,巨集定義很容易產生二義性,它的使用就存在一系列的隱患。

1. 內聯函式的介紹

內聯函式從源**層看,有函式結構,而在編譯後,卻不具備函式性質,內聯函式不是在呼叫時發生控制轉移,而是在編譯時將函式體嵌入每乙個呼叫處,編譯時,類似巨集替換,使用函式體替換呼叫處的函式名,在**中用inline關鍵字修飾,在類中宣告的成員函式,自動轉換為內聯函式。

類中的成員函式預設是內聯函式(要求成員函式沒有迴圈和遞迴,當其中存在迴圈的遞迴的時候,編譯器會將其預設為乙個普通函式處理)。

內聯函式不允許有迴圈或者遞迴語句。

內聯函式的定義必須出現在第一次呼叫內聯函式之前。

2. 內聯函式的優點

有引數型別檢測,更加安全。

內聯函式是在程式執行時展開,而且是進行引數傳遞。

inline關鍵字只是對編譯器的乙個定義,如果函式本地不符合內聯函式的標準,編譯器就會將這個函式當作是普通函式。(換句話說就是,你使用內聯函式,只不過是向編譯器提出乙個申請,編譯器可以拒絕你的申請)

3. 內聯函式的缺點

因為內聯函式是在呼叫處展開,所以會使**邊長,占用更多記憶體。

內聯函式在執行時可除錯,而巨集定義不可以。

編譯器會對內聯函式的引數型別做安全檢查或自動型別轉換,而巨集定義則不會。

內聯函式可以訪問類的成員變數,而巨集定義則不能。

巨集是由預處理器對巨集進行替代,而內聯函式是通過編譯器控制來實現的。

C inline和 define巨集的區別

1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內。2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率問題。另外,前面我們講到了巨集,裡面有這麼乙個例子 define abs x x 0?x x 當 i出現時,巨集就會歪曲我們的意思...

c inline函式和巨集 函式呼叫

1 函式的呼叫必須將程式執行的順序轉移到存放函式所的位址,將函式的程式內容執行完成後,再次轉到執行該函式的地方,這種轉移操作要求執行前儲存現場,並記憶執行的位址。因此函式呼叫有一定的時間和空間開銷,影響效率。2 巨集只是在預處理的地方把 展開,不需要額外的位址和空間。所以巨集比函式呼叫更有效率。但是...

C inline 與 define 區別聯絡

1 inline與 define 內聯函式是 被插入到呼叫者 處的函式。如同 define 巨集,內聯函式通過避免被呼叫的開銷來提高執行效率,尤其是它能夠通過呼叫 過程化整合 被編譯器優化。2 區別 內聯函式在編譯時展開,而巨集是由預處理器對巨集進行展開 內聯函式會檢查引數型別,巨集定義不檢查函式引...