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