元旦了,各種打不開部落格。元旦結束,部落格好了,是因為元旦放假程式設計師都回家了嘛?
內聯函式和普通函式有所區別。
普通函式需要①函式定義②函式原型③函式呼叫,具體呼叫形式是,先呼叫時,儲存當前函式的記憶體位址(假設為位址a
),然後呼叫函式,跳到被呼叫函式的記憶體位址(位址
b),然後在位址
b處依次執行,等執行完被呼叫的函式(或許還有返回值),再返回之前儲存的位址a處。
內聯函式,可以省略②函式原型(也可以不省略),但需要在函式定義和函式原型的函式頭之前加上關鍵字inline
(如果省略函式原型的話,則一般將函式定義放在函式原型的地方),
他的機制,是把函式**,放在函式呼叫時的記憶體位址處,這樣的話,無需像普通函式那樣,從位址a
處跳到位址
b處,呼叫完再跳回來,而是位址
a處之後的記憶體位置,就是原本是位址
b處函式的**內容。就像直接將函式命令放在呼叫處一樣。
例如:int main()
;這樣的形式。
由於內聯函式是直接放在main
函式中(而不是呼叫的時候才占用記憶體),因此,使用內聯函式更耗費記憶體。但相對而言,使用內聯函式的優點則是速度更快(因為不用在記憶體之中跳來跳去)。
但,由於在記憶體位址中跳來跳去速度其實很快,所以節省的時間的絕對值,並不大,除非該函式經常被呼叫(每次節約0.01
秒,100
次就是1
秒了)。
內聯函式的優點:速度更快——適合執行**時間很短的函式;
編譯器不允許使用內聯函式的兩種情況:
①遞迴函式——內聯函式不允許自己呼叫自己;
②函式過大。
內聯函式的使用方式:
①在函式原型和函式定義的函式頭之前加上關鍵字inline
即可;
②可省略函式原型,若省略,則將函式定義放置於函式原型處較好;
③其他同普通函式。
如**:
#includeinline int chengfang(int a) //函式定義前置於函式原型處,並可省略函式原型
int main()
輸出:
b = 4. c = 25
與內聯函式對應的巨集:
在c語言中,使用預處理器語句
#define
來提供巨集——內聯**的原始實現。
例如巨集:#define squar(x) x*x;
巨集的特點是文字替換,而不像內聯函式那樣是函式呼叫——也就意味著,沒有括號的情況下,結果和內聯函式的結果不同。
如define
的**:
#include#define square(x) x*x;
int main()
輸出:
a[0] = 1
a[1] = 4
a[2] = 16
a[3] = 8
a[4] = 2
請按任意鍵繼續. . .
使用內聯函式的**:
#includeinline int square(int x)
int main()
輸出:
a[0] = 1
a[1] = 4
a[2] = 16
a[3] = 16
a[4] = 4
請按任意鍵繼續. . .
由上述兩個例子可以看出,#define
巨集的效果,和
inline
內聯函式的機制完全不同。
#define是文字替換,將括號裡的內容直接賦值到表示式之中——而不是括號裡表示式的結果。
inline是像函式呼叫那樣,將表示式的值得出值的結果後,再放入函式內部的表示式之中。
特別是比如說:#define mm(m) m*m*m; 這樣的巨集,
當遇見呼叫int a=1; int b=mm(a++);時,
在**中,b=1*2*3=6,
而不是內聯函式的b=1*1*1
(因為a++
是先執行完這行**之後,
a=a+1);
mysql 內聯函式 Kotlin內聯函式
內聯函式使用關鍵字內聯宣告,內聯函式的使用增強了高階函式的效能。內聯函式告訴編譯器將引數和函式複製到呼叫站點。虛函式或區域性函式不能宣告為內聯。以下是內聯函式內部不支援的一些表示式和宣告 區域性類宣告 內部巢狀類的宣告 函式表示式 宣告區域性函式 區域性可選引數的預設值 讓我們看一下內聯函式的基本示...
函式之內聯函式
內聯函式 定義 內聯函式是c 為提高程式執行速度所進行的一項改進。常規函式與內聯函式之間的區別不在於編寫方式,而在於c 編譯器如何將他們組合到程式裡。c 函式的編譯 與其他程式的 內聯 了起來,也就是說,編譯器將使用相應的函式 代替函式呼叫。對於內聯函式,程式無需調到另乙個位置處執行 再跳回來,因此...
內聯函式 虛函式
在c 中,inline關鍵字和virtual關鍵字分別用來定義c 中的內聯函式和虛函式,他們在各自的場合都有其各自的應用,下面將簡單介紹他們各自的功能,然後在說明為什麼乙個函式不能同時是虛函式和內聯函式 inline 內聯函式的目的是為了減少函式呼叫時間。它是把內聯函式的函式體在編譯器預處理的時候替...