在c語言中,我們使用巨集定義函式這種借助編譯器的優化技術來減少程式的執行時間,那麼在c++中有沒有相同的技術或者更好的實現方法呢?答案是有的,那就是內聯函式。內聯函式作為編譯器優化手段的一種技術,在降低執行時間上非常有用。我們將從:
什麼是內聯函式
為什麼要使用內聯函式
內聯函式優缺點分析
何時使用內聯函式
這四個方面對內聯函式進行介紹。
內聯函式是c++的增強特性之一,用來降低程式的執行時間。當內聯函式收到編譯器的指示時,即可發生內聯:編譯器將使用函式的定義體來替代函式呼叫語句,這種替代行為發生在編譯階段而非程式執行階段。
值得注意的是,內聯函式僅僅是對編譯器的內聯建議,編譯器是否覺得採取你的建議取決於函式是否符合內聯的有利條件。如何函式體非常大,那麼編譯器將忽略函式的內聯宣告,而將內聯函式作為普通函式處理。
定義函式時,在函式的最前面以關鍵字「inline」宣告函式,即可使函式稱為內聯宣告函式。
例如:
class a;}class a
;inline
int a::add(int a, int
b)
有時候我們會寫一些功能專一的函式,這些函式的函式體不大,包含了很少的執行語句。例如在計算1~1000以內的素數時,我們經常會使用開方操作使運算範圍縮小,這時我們會寫乙個函式:
int root(intn)
然後我們的求範圍內素數的函式可以這樣寫。
int prime(intn)}
當然,把root函式放在迴圈中不是個不明智的選擇,但想象一下,在某個程式上下文內必須頻繁地呼叫某個類似root的函式,其呼叫函式的花銷會有多大:當遇到普通函式的呼叫指令時,程式會儲存當前函式的執行現場,將函式中的區域性變數以及函式位址壓入堆疊,然後再將即將呼叫的新函式載入到記憶體中,這要經歷複製引數值、跳轉到所呼叫函式的記憶體位置、執行函式**、儲存函式返回值等過程,當函式執行完後,再獲取之前正在呼叫的函式的位址,回去繼續執行那個函式,執行時間開銷簡直太多了。
c++內聯函式提供了替代函式呼叫的方案,通過inline宣告,編譯器首先在函式呼叫處使用函式體本身語句替換了函式呼叫語句,然後編譯替換後的**。因此,通過內聯函式,編譯器不需要跳轉到記憶體其他位址去執行函式呼叫,也不需要保留函式呼叫時的現場資料。通過下面這些優缺點總結你大概會更理解為什麼要使用inline函式:
優點:它通過避免函式呼叫所帶來的開銷來提高你程式的執行速度。
當函式呼叫發生時,它節省了變數彈棧、壓棧的開銷。
它避免了乙個函式執行完返回原現場的開銷。
通過將函式宣告為內聯,你可以把函式定義放在標頭檔案內。
缺點:因為**的擴充套件,內聯函式增大了可執行程式的體積。
c++內聯函式的展開是中編譯階段,這就意味著如果你的內聯函式發生了改動,那麼就需要重新編譯**。
當你把內聯函式放在標頭檔案中時,它將會使你的標頭檔案資訊變多,不過標頭檔案的使用者不用在意這些。
有時候內聯函式並不受到青睞,比如在嵌入式系統中,嵌入式系統的儲存約束可能不允許體積很大的可執行程式。
當程式設計需要時,每個函式都可以宣告為inline。下面列舉一些有用的建議:
當對程式執行效能有要求時,那麼就使用內聯函式吧。
當你想巨集定義乙個函式時,那就果斷使用內聯函式吧。
在類內部定義的函式會預設宣告為inline函式,這有利於類實現細節的隱藏。
關鍵點內聯宣告只是一種對編譯器的建議,編譯器是否採用內聯措施由編譯器自己來決定。甚至在彙編階段或鏈結階段,一些沒有inline宣告的函式編譯器也會將它內聯展開。
編譯器的內聯看起來就像是**的複製與貼上,這與預處理巨集是很不同的:巨集是強制的內聯展開,可能將會汙染所有的命名空間與**,將為程式的除錯帶來困難。
所有中類中定義的函式都預設宣告為inline函式,所有我們不用顯示地去宣告inline。
虛函式不允許內聯。
雖然說模板函式放中標頭檔案中,但它們不一定是內聯的。(不是說定義在標頭檔案中的函式都是內聯函式)。
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出現時,巨集就會歪曲我們的意思...