C 中的內聯函式

2021-09-19 03:03:46 字數 1482 閱讀 9538

這是一篇被重寫的部落格,重寫參考書籍《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 說明符。使用示例如下。

inline

double

square

(double x)

1.在內聯函式內不允許使用迴圈語句和開關語句;

2.內聯函式的定義必須出現在內聯函式第一次呼叫之前;

3.類結構中所在的類說明內部定義的函式是內聯函式。

4.內聯函式一般都是1-10行的小函式

有些函式即使宣告為內聯的也不一定會被編譯器內聯, 這點很重要; 比如虛函式和遞迴函式就不會被正常內聯. 通常, 遞迴函式不應該宣告成內聯函式.(遞迴呼叫堆疊的展開並不像迴圈那麼簡單, 比如遞迴層數在編譯時可能是未知的, 大多數編譯器都不支援內聯遞迴函式). 虛函式內聯的主要原因則是想把它的函式體放在類定義內, 為了圖個方便, 抑或是當作文件描述其行為, 比如精短的訪問函式.

C 中的內聯函式

華清遠見嵌入式學院 講師。c 中存在一些具有特殊意義或功能的特殊函式,我們來簡單介紹一下內聯函式。從軟體工程的角度來看,我們通常將乙個程式通過一組函式來進行實現,但是函式的呼叫涉及到執行時間的開銷,如果有的函式需要頻繁使用,則累計占用的時間會很長,所以c 提供了內聯函式的機制來提高效率,也就是在編譯...

C 中的內聯函式

c 中的內聯函式 華清遠見嵌入式學院講師。c 中存在一些具有特殊意義或功能的特殊函式,我們來簡單介紹一下內聯函式。從軟體工程的角度來看,我們通常將乙個程式通過一組函式來進行實現,但是函式的呼叫涉及到執行時間的開銷,如果有的函式需要頻繁使用,則累計占用的時間會很長,所以c 提供了內聯函式的機制來提高效...

C 中的內聯函式

本文主要和大家一起來學習一下c 中的內聯函式,旨在能夠更深層次的了解和掌握c 相關用法,力爭做到知其然還要知其所以然。關於內聯函式,本文主要從以下幾個方面進行了整理和歸納。一 相關描述 1 內聯函式主要目的是為了提高函式的執行效率,用關鍵字inline放在函式定義的前面即可,將函式指定為內聯函式。2...