常規(guī)函數(shù)與內(nèi)聯(lián)函數(shù)的區(qū)別不在于編寫方式,而在于編譯器如何將他們組合到程序中。常規(guī)函數(shù)調(diào)用時(shí),程序?qū)⒃诤瘮?shù)調(diào)用后立即存儲(chǔ)該指令的內(nèi)存地址,并將函數(shù)參數(shù)賦值到堆棧,跳到標(biāo)記函數(shù)起點(diǎn)的內(nèi)存單元,執(zhí)行函數(shù)代碼,然后跳回到地址被保存的指令處。來(lái)回跳躍并記錄跳躍位置意味著常規(guī)函數(shù)需要一定的開銷。
內(nèi)聯(lián)函數(shù)則編譯器將使用相應(yīng)的函數(shù)代碼替換函數(shù)調(diào)用(即直接展開),無(wú)需來(lái)回跳轉(zhuǎn)。因此運(yùn)行速度比常規(guī)函數(shù)快,但會(huì)占用較多內(nèi)存。但如果執(zhí)行函數(shù)代碼比處理函數(shù)調(diào)用機(jī)制的時(shí)間長(zhǎng),則節(jié)省的時(shí)間只占很小一部分。故若定義占多行,則不太合適。相反,如果代碼執(zhí)行時(shí)間很短,或者經(jīng)常被調(diào)用,則很有意義。
措施是在函數(shù)聲明和函數(shù)定義前加上關(guān)鍵字inline。通常是省略原型,將整個(gè)定義放在本應(yīng)提供聲明的地方(例如.h文件中)。格式如下:
inline double square ( double x) { return x * x;}
內(nèi)聯(lián)函數(shù)的原始實(shí)現(xiàn)實(shí)際上是#define提供宏。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注