這是一篇被重寫的部落格,重寫參考書籍《c++ primer plus》在c語言中,我們使用預處理語句#define來提供如下的函式形式的巨集(內聯的原始實現)
我們在使用這種巨集的時候,就感覺像在使用函式一樣,但其實這只是一種文字替換,它並不提供型別檢查,而且有時候替換出來的效果和我們想要的不太一樣。如下所示#define square(x) x*x
上面的示例只有乙個能正常工作。a =
square
(5.0
); is replaced by a =
5.0*
5.0;
b =square
(4.7
+7.5
); is replaced by b =
4.5+
7.5*
7.5+
7.5;
d =square
(c++
); is replaced by d = c++
*c++
c++採用一種更好的方式來實現這種效果(可以將函式在被呼叫出直接展開,同時可以提供型別檢查),那就是內聯函式,我們下面會仔細講解內聯函式的使用方式及其注意點。
內聯函式inline:引入內聯函式的目的是為了解決程式中函式呼叫的效率問題,這麼說吧,程式在編譯器編譯的時候,編譯器將程式**現的內聯函式的呼叫表示式用內聯函式的函式體進行替換,而對於其他的函式,都是在執行時候才被替代。當函式體比較小的時候, 內聯該函式可以令目標**更加高效. 對於訪問函式以及其它函式體比較短, 效能關鍵的函式, 鼓勵使用內聯.,這其實就是以空間代價換時間。在使用內聯函式時要留神:
如果想把乙個函式定義為內聯函式,則需要在函式名前面放置關鍵字 inline,在呼叫函式之前需要對函式進行定義。如果函式過長(到底多長算長,這個不一定),編譯器會忽略 inline 限定符。在類定義中定義的函式都是內聯函式,即使沒有使用 inline 說明符。使用示例如下。
1.在內聯函式內不允許使用迴圈語句和開關語句;inline
double
square
(double x)
2.內聯函式的定義必須出現在內聯函式第一次呼叫之前;
3.類結構中所在的類說明內部定義的函式是內聯函式。
4.內聯函式一般都是1-10行的小函式
有些函式即使宣告為內聯的也不一定會被編譯器內聯, 這點很重要; 比如虛函式和遞迴函式就不會被正常內聯. 通常, 遞迴函式不應該宣告成內聯函式.(遞迴呼叫堆疊的展開並不像迴圈那麼簡單, 比如遞迴層數在編譯時可能是未知的, 大多數編譯器都不支援內聯遞迴函式). 虛函式內聯的主要原因則是想把它的函式體放在類定義內, 為了圖個方便, 抑或是當作文件描述其行為, 比如精短的訪問函式.
C 中的內聯函式
華清遠見嵌入式學院 講師。c 中存在一些具有特殊意義或功能的特殊函式,我們來簡單介紹一下內聯函式。從軟體工程的角度來看,我們通常將乙個程式通過一組函式來進行實現,但是函式的呼叫涉及到執行時間的開銷,如果有的函式需要頻繁使用,則累計占用的時間會很長,所以c 提供了內聯函式的機制來提高效率,也就是在編譯...
C 中的內聯函式
c 中的內聯函式 華清遠見嵌入式學院講師。c 中存在一些具有特殊意義或功能的特殊函式,我們來簡單介紹一下內聯函式。從軟體工程的角度來看,我們通常將乙個程式通過一組函式來進行實現,但是函式的呼叫涉及到執行時間的開銷,如果有的函式需要頻繁使用,則累計占用的時間會很長,所以c 提供了內聯函式的機制來提高效...
C 中的內聯函式
本文主要和大家一起來學習一下c 中的內聯函式,旨在能夠更深層次的了解和掌握c 相關用法,力爭做到知其然還要知其所以然。關於內聯函式,本文主要從以下幾個方面進行了整理和歸納。一 相關描述 1 內聯函式主要目的是為了提高函式的執行效率,用關鍵字inline放在函式定義的前面即可,將函式指定為內聯函式。2...