复习笔记(四)——C++内联函数
什么是內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)是指通過(guò) inline 關(guān)鍵字定義的函數(shù),包括全局函數(shù)和類的成員函數(shù)。
內(nèi)聯(lián)函數(shù)在編譯階段展開,編譯器將整個(gè)函數(shù)體代碼嵌入到調(diào)用處,不產(chǎn)生函數(shù)跳轉(zhuǎn)。
內(nèi)聯(lián)函數(shù)的定義
inline 關(guān)鍵字必須用于函數(shù)體定義,在函數(shù)聲明前使用無(wú)效
inline int add(int x, int y); // 聲明處使用無(wú)效 int add(int x, int y); //正確聲明方式inline int add(int x, int y) { // 定義處使用有效return x + y; }內(nèi)聯(lián)函數(shù)優(yōu)劣
優(yōu)點(diǎn):
①函數(shù)內(nèi)聯(lián)可以避免了頻繁調(diào)用函數(shù)對(duì)棧內(nèi)存重復(fù)開辟所帶來(lái)的消耗,提高運(yùn)行效率。
②內(nèi)聯(lián)函數(shù)可以允許全局函數(shù)重復(fù)定義,編譯時(shí)會(huì)選取編譯單元可見的函數(shù)進(jìn)行內(nèi)聯(lián)。
缺點(diǎn):
內(nèi)聯(lián)函數(shù)適用于頻繁調(diào)用的短小函數(shù),如果濫用,則也存在很多危害,比如:
①編譯和鏈接的時(shí)間會(huì)更慢
②代碼膨脹,占用更多的內(nèi)存。
③影響 cpu 緩存優(yōu)化,降低運(yùn)行時(shí)性能。
inline 限制
inline 關(guān)鍵字僅僅是一種對(duì)編譯器的建議,是否真的發(fā)生內(nèi)聯(lián),要看編譯器的分析,比如下面場(chǎng)景編譯器會(huì)拒絕內(nèi)聯(lián):
- 函數(shù)體內(nèi)部包含循環(huán)、遞歸、switch語(yǔ)句。
- 函數(shù)過(guò)于復(fù)雜,復(fù)雜到函數(shù)本身執(zhí)行的成本,比函數(shù)調(diào)用(棧開銷)成本還要高。
- inline 可以修飾虛函數(shù),但是當(dāng)虛函數(shù)表現(xiàn)多態(tài)性的時(shí)候不能內(nèi)聯(lián),因?yàn)闊o(wú)法知道具體將哪一部分代碼插入到調(diào)用位置。
與宏定義區(qū)別
內(nèi)聯(lián)函數(shù)和帶參數(shù)的宏定義類似,都可以避免函數(shù)調(diào)用的開銷,但是有以下區(qū)別
- 內(nèi)聯(lián)函數(shù)在編譯時(shí)展開,宏在預(yù)編譯時(shí)展開
- 內(nèi)聯(lián)函數(shù)直接嵌入到目標(biāo)代碼中,宏是簡(jiǎn)單的做文本替換
- 內(nèi)聯(lián)函數(shù)有類型檢測(cè)、語(yǔ)法判斷等功能,而宏沒(méi)有
- inline 函數(shù)是函數(shù),宏不是
- 宏定義時(shí)要注意書寫(參數(shù)要括起來(lái))否則容易出現(xiàn)歧義,內(nèi)聯(lián)函數(shù)不會(huì)產(chǎn)生歧義
內(nèi)聯(lián)函數(shù)與類
對(duì)調(diào)用頻繁且代碼簡(jiǎn)單的成員函數(shù)可以使用內(nèi)聯(lián)函數(shù). 則編譯時(shí)此內(nèi)聯(lián)函數(shù)的執(zhí)行代碼會(huì)插入到每個(gè)調(diào)用它的地方
內(nèi)聯(lián)函數(shù)在類中的聲明
隱式聲明:把函數(shù)執(zhí)行代碼寫在類主體內(nèi)
顯式聲明:為了程序的可讀性,一般為顯式聲明, 即函數(shù)實(shí)現(xiàn)時(shí)返回值類型前加inline; 類主體內(nèi)如同一般的成員函數(shù)聲明
示例:
class A { public:void count(int x, int y); // 函數(shù)聲明 } //顯示聲明 inline void A::count(int x, int y) // 表明是一個(gè)內(nèi)聯(lián)函數(shù) { }// 若是定義在類內(nèi),就是隱式內(nèi)聯(lián)了,比如, //沒(méi)有inline關(guān)鍵字,但系統(tǒng)默認(rèn)count是內(nèi)聯(lián)函數(shù) class A { public: void count(int x, int y){ /****/ } }總結(jié)
以上是生活随笔為你收集整理的复习笔记(四)——C++内联函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 复习笔记(三)——C++类和对象
- 下一篇: s3c2440移植MQTT