內聯函式是c++當中為了提高程式執行效率的設計,老實講我沒有在其他語言當中看到類似的設計。它和常規函式之間的主要區別不在pemnakfx於編寫的方式,而是在於c++編譯器會將內聯函式組合到程式當中執行。
要解釋這個過程會稍稍有些複雜,我們需要從編譯的過程說起。對於編譯型語言而言,編譯器做的事情是把人類寫出來人能讀懂的**翻譯成程式設計客棧機器能夠識別、執行的機器語言,一般是一串十六進製制的指令。隨後計算機逐步執行這些指令,完成我們想要的功能。
當我們呼叫函式時,其實本質上是指令跳轉,先記錄下當前執行的指令位置,跳轉到函式所在的指令位置進行執行,執行完成之後再程式設計客棧跳轉回來。這個當中除了跳轉之外,還會發生一些引數的傳遞和拷貝,需要一定的開銷。
而使用內聯函式,本質上可以理解成使用相應的函式**代替了函式呼叫。可以簡單理解成把函式當中的**拷貝了乙份貼上到了函式呼叫的位置,代替了函式跳轉。舉個例子,比如說我們有乙個函式來計算座標到原點的距離:
include
double distance(double x, double y)
double x = 3.0, y = 4.0;
double d = distance(x, y);
當我們使用了內聯函式之後,它相當於把函式的**拷貝了乙份貼上到了呼叫的位置:
double x = 3.程式設計客棧0, y = 4.0;
double d = sqrt(x * x + y * y);
這也就是內聯的含義,使用了內聯函式之後,程式無須跳轉到另外乙個位置進行執行,可以節省掉跳轉所帶來的開銷。因此執行效率要比普通函式更快,但代價是需要占用更多的記憶體。比如我們呼叫了10次內聯函式,相當於**拷貝了十份。
內聯函式的使用非常簡單,就是在函式定義之前加上inline關鍵字。
需要注意的是,有的時候我們雖然加上了inline關鍵字但編譯器並不一定會遵照執行。有些編譯器會有函式規模的限制,並且會限制內聯函式禁止呼叫自己,也就是不能遞迴。
還有一點是內聯函式雖然有內聯機制,但是函式的傳參依然是值傳遞,也就是說會發生拷貝,和普通函式一致。
在c語言當中沒有inline特性,c語言是使用巨集定義來實現類似的功能。但巨集定義並不是通過引數傳遞,而是代替機械替換實現的。
比如:#define square(x) x*x
double a = square(3.4 + 3.5);
這樣我們得到的結果pemnakfx會是3.4 + 3.5 * 3.4 + 3.5,也就是說巨集定義只是機械地替換**,並不是函式式的呼叫。所以要實現類似inline函式的效果,可以使用括號:
#define square(x) ((x) * (x))
C 內聯函式
1 什麼是內聯函式?內聯函式就是小型函式,犧牲空間來節省函式呼叫的開銷,一般用作比較小的函式,即函式內部沒有迴圈 開關語句等。內聯函式被發明出來就是為了取代c中的巨集,因為巨集是單純的替換而沒有型別檢查所以經常出毛病,2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率...
C 內聯函式
1 什麼是內聯函式?2 為什麼要引入內聯函式?3 為什麼inline能取代巨集?4 內聯函式和巨集的區別?5 什麼時候用內聯函式?6 如何使用內聯函式?7 內聯函式的優缺點?8 如何禁止函式進行內聯?9 注意事項 1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內...
c 內聯函式
1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內。2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率問題。另外,前面我們講到了巨集,裡面有這麼乙個例子 define abs x x 0?x x 當 i出現時,巨集就會歪曲我們的意思...