C inline與 define的區別

2021-09-10 04:54:25 字數 1647 閱讀 5309

以inline修飾的函式叫做內聯函式,編譯時c++編譯器會在呼叫內聯函式的地方展開,沒有函式壓棧的開銷, 從而能夠提公升程式執行的效率。

inline是一種以空間換時間的做法,省去呼叫函式的開銷。所以**很長或者有迴圈/遞迴的函式不適宜作為內聯函式。

inline對於編譯器而言只是乙個建議,編譯器會自動優化,如果定義為inline的函式體內有迴圈/遞迴等 ,編譯器優化時會忽略掉內聯。

內聯函式不能是虛函式。(原因:inline是通過編譯器將函式內容替換到函式呼叫處,是靜態編譯的。而虛函式是動態呼叫的,在編譯器並不知道需要呼叫的是父類還是子類的虛函式,所以不能夠inline宣告展開,因此編譯器會忽略

在c++中,在類的內部定義了函式體的成員函式預設是內聯函式,不管是否有inline關鍵字。 

在內聯函式內不允許用迴圈語句、開關語句和遞迴呼叫等,且函式體不宜過長,否則作為普通函式處理。

內聯函式的定義必須出現在第一次被呼叫之前。如果在前面宣告為普通函式,而在呼叫**後面才定義為乙個inline函式,程式可以通過編譯,但該函式沒有實現inline。

如果乙個inline函式會在多個原始檔中被用到,那麼必須把它定義在標頭檔案中。解析:如果內聯函式fun()定義在某個編譯單元a中,那麼其他編譯單元中呼叫fun()的地方時,可以編譯通過(此時並沒有展開,結合第三條,此時雖然標頭檔案宣告了該inline函式,但此時呼叫時,還沒定義,所以作為普通函式處理)。當鏈結時將無法解析該符號,出現鏈結錯誤。 因為inline函式是作為內部連線存在的,只能夠被本模組訪問

inline函式是函式,有型別,要做型別檢查,因此安全可靠,可以得到一定效率的提公升,這個是以增加空間的消耗為代價

定義預編譯時處理的巨集,只是簡單的字串替換,無型別檢查

在巨集擴充套件時,只對巨集名做簡單的代換,不做任何計算,也不做任何語法檢查。巨集由編譯預處理程式處理

巨集定義可出現在程式的任何位置。

在巨集定義中可以使用已定義的巨集名。

不帶引數的巨集定義格式:#define 識別符號 字元或字串

帶引數的巨集定義格式:   #define 巨集名(參數列) 使用引數的字元或字串

define無型別,不做檢查就直接替換,因此並不安全,會帶有***;巨集不能除錯,會使得**變得龐大。

內聯函式在編譯時展開,巨集在預編譯時由預處理器進行展開。內聯函式會檢查引數型別,巨集定義不檢查函式引數 ,所以內聯函式更安全。inline函式是函式,巨集不是函式。巨集在定義時要小心處理巨集引數(一般情況是把引數用括弧括起來),否則易出現二義性,而內聯定義不會出現。編譯內聯函式可以嵌入到目標**,巨集只是簡單文字替換。

基於上述區別中的第2點,為了保證安全性在c++中盡量使用inline代替巨集。

C inline 與 define 區別聯絡

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

c inline和 define巨集的區別

1.為什麼要是用巨集定義 對比與一般的呼叫函式 因為呼叫巨集比呼叫函式更有效率,函式的呼叫必須要將程式的執行順序轉移到函式所存放的記憶體位址中,將函式程式內容執行完後,再返回到執行該函式前的地方,這種轉移操作要求執行前要儲存現場並記憶執行位址,轉回後要恢復現場,並按原來儲存的位址繼續執行,因此,函式...

C inline和 define巨集的區別

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