巨集和c 中的inline內聯函式

2021-06-05 07:37:40 字數 2723 閱讀 8166

inline函式是c++引入的機制,目的是解決使用巨集定義的一些缺點。

1.為什麼要引入內聯函式(內聯函式的作用)

用它替代巨集定義,消除巨集定義的缺點。巨集定義使用預處理器實現,做一些簡單的字元替換因此不能進行引數有效性的檢測。另外它的返回值

不能被強制轉換為可轉換的合適

型別,且c++中引入了類及類的訪問控制,在涉及到類的

保護成員和私有成員

就不能用巨集定義來操作

2.inline相比巨集定義有哪些優越處

(1)inline函式**是被放到符號表中,使用時像巨集一樣展開

,沒有呼叫的開銷效率很高

(2)inline函式是真正的函式,所以要進行一系列的資料型別檢查

(3)inline函式作為類的成員函式,可以使用類的保護成員及私有成員

3.inline函式使用的場合

(1)使用巨集定義的地方都可以使用inline函式

(2)作為類成員介面函式來讀寫類的私有成員或者保護成員

4.為什麼不能把所有的函式寫成inline函式

內聯函式以**複雜為代價,它以省去函式呼叫的開銷來提高執行效率。所以一方面如果內聯函式體內**執行時間相比函式呼叫開銷較大沒有太大的意義;另一方面每一處內聯函式的呼叫都要複製**,消耗更多的記憶體空間,因此以下情況不宜使用內聯函式。

(1)函式體內的**比較長,將導致記憶體消耗代價;

(2)函式體內有迴圈,函式執行時間要比函式呼叫開銷大;

另外類的構造與析構函式不要寫成內聯函式

5.內聯函式與巨集定義區別

(1)內聯函式在編譯時展開,巨集在預編譯是展開

(2)內斂函式直接嵌入到目標**中,巨集是簡單的做文字替換

(3)內斂函式有型別檢測、語法判斷等功能,而巨集沒有

(4)inline函式是函式,巨集不是

(5)巨集定義時要注意書寫(引數要括起來)否則容易出現歧義,內聯函式不會產生歧義

內聯函式和普通函式相比可以加快程式執行的速度,因為不需要中斷呼叫,在編譯的時候內聯函式可以直接嵌入到目標**中。

而且和c時代的巨集函式相比,inline更安全可靠。可是這個是以增加空間消耗為代價的。

巨集定義是在預處理的過程中進行的,只作簡單的替換而不作語法檢查,所以與我們現在提到的內聯函式還是有本質的不同

從軟體工程的角度來看,我們通常將乙個程式通過一組函式來進行實現,但是函式的呼叫涉及到執行時間的開銷,如果有的函式需要頻繁使用,則累計占用的時間會很長,所以c++提供了內聯函式的機制來提高效率也就是在編譯時將所呼叫的函式的**嵌入到主函式中,這種嵌入到主函式中的函式稱為內聯函式

內聯函式的實現方式:

1.在作為內聯的函式前加關鍵字inline

2.在類的定義過程中將函式的實現直接放在類中實現

如下例:

#include

using namespace std;

inlineint max(int m , int n )

int main()

如上例,使用了內聯函式來進行2個數中最大值的求解,由於在定義函式的時候指定max函式為內聯函式,因此編譯系統在遇到函式呼叫語句時,就用max函式體的**來代替呼叫語句,同時將實參代替形參。這樣分析來看,內聯函式與c語言中的巨集定義有些類似,但不同的是,巨集定義是在預處理的過程中進行的,只作簡單的替換而不作語法檢查,所以與我們現在提到的內聯函式還是有本質的不同,需要理解區分一下。

並不是我們對某個函式進行內聯函式的宣告,系統就將其作為內聯函式來使用,編譯器會觀察其是否符合成為內聯函式的要求須滿足如下條件

1. 函式體短小精悍且被頻繁呼叫

2. 沒有迴圈及開關語句

3. 沒有static關鍵字

綜上所述,並不是我們進行了相應的宣告就可以定義乙個內聯函式,另外需要說明的是:

1.內聯說明對於編譯器來說只是乙個建議,編譯器可以選擇忽略這個建議,大多數的編譯器都不支援遞迴的函式內聯,乙個過長的函式也不太可能在調 用點進行內聯展開。

2.內聯函式應該在標頭檔案中定義,這一點不同於其他函式。

3.如果在標頭檔案中加入或修改內聯函式時,使用了該標頭檔案的所有原始檔都必須重新編譯

C 中inline內聯函式和巨集之間的區別

inline函式是c 引入的機制,目的是解決使用巨集定義的一些缺點。用它替代巨集定義,消除巨集定義的缺點。巨集定義使用預處理器實現,做一些簡單的字元替換,因此不能進行引數有效性的檢測。另外它的返回值不能被強制轉換為可轉換的合適型別,且c 中引入了類及類的訪問控制,在涉及到類的保護成員和私有成員就不能...

inline內聯函式和巨集的區別

1 內聯函式在編譯時展開,而巨集在預編譯時展開 2 在編譯的時候,內聯函式直接被嵌入到目標 中去,而巨集只是乙個簡單的文字替換。3 內聯函式可以進行諸如型別安全檢查 語句是否正確等編譯功能,巨集不具有這樣的功能。4 巨集不是函式,而inline是函式 5 巨集在定義時要小心處理巨集引數,一般用括號括...

C 中的內聯函式(inline)與巨集定義

當我們定義完乙個函式之後,實際呼叫的時候,函式體本身會壓入堆疊,主函式再從堆疊裡面把這部分內容提取出來,產生一定的系統開銷,對於大型函式來說,這部分開銷可能相對於函式體本身執行的開銷來說微乎其微。但是如果乙個函式僅僅只是為了完成乙個特別簡單的功能,比如交換兩個變數的值,亦或是求兩個變數的最大值,這時...