1.在YYModel中發(fā)現(xiàn)如下的一個(gè)宏.
#define force_inline __inline__ __attribute__((always_inline))
2.百度 __inline__ __attribute__((always_inline))
的意思是強(qiáng)制內(nèi)聯(lián).所有加 __inline__ __attribute__((always_inline))
修飾的函數(shù)在被調(diào)用的時(shí)候不會(huì)被編譯成函數(shù)調(diào)用,而是直接擴(kuò)展到調(diào)用函數(shù)體內(nèi).
具體什么意思呢?
需要理解下,我們寫的代碼并不是直接去運(yùn)行的.是編譯器將我們的代碼先編譯成底層可以識(shí)別的代碼.c或者匯編.
當(dāng)我們用__inline__ __attribute__((always_inline))
修飾一個(gè)函數(shù)的時(shí)候,編譯器會(huì)將我們的代碼編譯.在調(diào)用的地方將我們的函數(shù),插入到調(diào)用的地方.
舉個(gè)栗子:
__attribute__((always_inline)) void a(){
print("a");
}
void b()
{
a();
}
編譯以后就是:
void b()
{
print("a");
}
總結(jié)
內(nèi)聯(lián)函數(shù)在編譯器最終生成的代碼中是 沒有定義的. 這個(gè)函數(shù)是不存在的.
內(nèi)聯(lián)函數(shù)也就沒有普通函數(shù)調(diào)用時(shí)的額外開銷 (壓榨,跳轉(zhuǎn),返回)
內(nèi)聯(lián)函數(shù)是一種特殊的函數(shù),具有普通函數(shù)的特征.
他是對(duì)編譯器的一種請(qǐng)求.因此,編譯器有可能拒絕這種請(qǐng)求.
內(nèi)聯(lián)函數(shù) 由 編譯器處理,直接將編譯后的函數(shù)體插入調(diào)用的地方.
另外:宏代碼片段 由預(yù)處理器處理,進(jìn)行簡(jiǎn)單的文本替換,沒有任何編譯過程.
C++中 內(nèi)聯(lián)編譯限制:
1.不能存在任何形式的循環(huán)語句.
2.不能存在過多的條件判斷語句.
3.函數(shù)體不能過于龐大.
4.不能對(duì)函數(shù)進(jìn)行取址操作.
5.內(nèi)聯(lián)函數(shù)聲明必須在調(diào)用語句之前.
當(dāng)函數(shù)體的執(zhí)行開銷大于壓棧,跳轉(zhuǎn)和返回所用的開銷時(shí),那么內(nèi)聯(lián)將無意義.