最近從新撿起c++,突然有乙個想法,為什麼內聯函式的會在標頭檔案中申明和定義。
如果是c++新手,對申明和定義這兩個詞比較陌生,那麼我先解釋一下申明和定義的意思(原諒我廢話多)
為什麼需要內聯函式?
函式呼叫包含一系列工作,例如儲存暫存器,並在返回時恢復,可能需要拷貝實參,程式轉向乙個新的位置執行等,這些工作會有一定開銷,如果把函式**在呼叫點上內聯地展開,就可以避免這些開銷,加快了程式執行速度,代價是程式體積會隨著內聯的次數增大
一、申明和定義
申明一般放標頭檔案中,定義一般放.cpp檔案中。
比如現在我有個計算絕對值的函式。
首先我建立乙個abs.**件申明這個函式:
int abs(int a);
然後建立乙個abs.ccp檔案定義這個函式:
#include "abs.h"
int abs(int a)else
}int main()
二、內聯函式是什麼?
簡單點來說:內聯函式就是把函式直接用函式體裡面的**替換。
如下,普通函式直接在前面建乙個inline關鍵字就變成了內聯函式。
inline int abs(int a){}
內聯函式就是把函式直接用函式體裡面的**替換這句話意思就是說當我們呼叫abs函式的時候,編譯器可以選擇直接通過替換函式體裡面的**。也就是說直接進行如下操作:
int main()
// 變成
int main()else
return 0;
}
三、內聯函樹為什麼定義在標頭檔案?
內聯函式發生上面那種替換是在編譯期間,在編譯期間編譯器為了找到需要找到內聯函式的定義,所以在為了方便編譯器找到定義,每個檔案引用標頭檔案後,都直接擁有這種定義,而不用再去寫。
而普通函式可以申明和定義分離,主要是編譯階段就不需要函式定義。首先編譯階段找到函式的申明,鏈結階段才會去找函式的定義,將之關聯起來。
[1]
[2]
const物件為什麼可以在標頭檔案中定義
對於標頭檔案中為什麼可以定義const變數 或物件 以及推薦用const代替 define巨集定義,之前一直概念不清晰,今天就總結一下。之前在網上查過,解釋的都不太到位,或者角度不一樣 從編譯原理 強弱定義?總之不能清晰理解,發現 c primer 上基本上涵蓋了所有平常遇到的c c 問題,而且 c...
inline函式定義在標頭檔案中
寫這個內聯函式的時候也沒細想,結果違反了inline函式的要求。所謂內聯函式,就是編譯器將函式定義 之間的內容 在函式呼叫處展開,藉此來免去函式呼叫的開銷。如果這個函式定義在標頭檔案中,所有include該標頭檔案的編譯單元都可以正確找到函式定義。然而,如果內聯函式fun 定義在某個編譯單元a中,那...
為什麼類的成員函式在標頭檔案中定義被多次包含沒問題呢
先看一段話 inline 和實際內聯是兩回事 但是 inline 寫出了 或者直接定義在類內部的被當成inline函式 的成員函式 它 不論有幾處定義 不論標頭檔案包含幾次,或者類被複製在不同實現檔案中幾次 都和 被內聯成功一樣 如果內聯成功,那麼就不會有函式定義的 生成,只會用 塊取代 函式呼叫。...