ZHCUAV8W january 1998 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
當(dāng)調(diào)用內(nèi)聯(lián)函數(shù)時(shí),在調(diào)用點(diǎn)插入該函數(shù)的 C/C++ 源代碼副本。這就是所謂的內(nèi)聯(lián)函數(shù)擴(kuò)展,通常稱為函數(shù)內(nèi)聯(lián) 或簡(jiǎn)稱內(nèi)聯(lián)。內(nèi)聯(lián)函數(shù)擴(kuò)展可以通過消除函數(shù)調(diào)用開銷來加快執(zhí)行速度。這對(duì)于經(jīng)常被調(diào)用的非常小的函數(shù)特別有用。函數(shù)內(nèi)聯(lián)涉及到在執(zhí)行速度和代碼大小之間進(jìn)行權(quán)衡,因?yàn)榇a在每個(gè)函數(shù)調(diào)用點(diǎn)都是重復(fù)的。在許多位置被調(diào)用的大型函數(shù)不適合內(nèi)聯(lián)。
過多內(nèi)聯(lián)會(huì)降低性能:過多內(nèi)聯(lián)會(huì)使編譯器顯著變慢并降低所生成代碼的性能。
以下情況會(huì)觸發(fā)函數(shù)內(nèi)聯(lián):
內(nèi)聯(lián) 關(guān)鍵字或等效的 __內(nèi)聯(lián) 關(guān)鍵字。如果設(shè)置 --opt_level=0 或更大值,則使用內(nèi)聯(lián)關(guān)鍵字聲明的函數(shù)可能會(huì)被編譯器內(nèi)聯(lián)。內(nèi)聯(lián)關(guān)鍵字是程序員對(duì)編譯器提出的建議。即使優(yōu)化級(jí)別很高,內(nèi)聯(lián)對(duì)于編譯器來說仍然是可選的。編譯器根據(jù)函數(shù)的長(zhǎng)度、函數(shù)被調(diào)用的次數(shù)、--opt_for_speed 設(shè)置以及函數(shù)中任何不允許函數(shù)內(nèi)聯(lián)的內(nèi)容來決定是否內(nèi)聯(lián)函數(shù)(請(qǐng)參閱節(jié) 2.11.2)。如果函數(shù)體在同一模塊中可見,或者使用了 -pm 且函數(shù)在正在編譯的模塊之一中可見,則可以在 --opt_level=0 或更高級(jí)別內(nèi)聯(lián)函數(shù)。如果包含定義信息的文件和調(diào)用點(diǎn)都使用了 --opt_level=4 進(jìn)行編譯,則可以在鏈接時(shí)內(nèi)聯(lián)函數(shù)。同時(shí)定義為靜態(tài)和內(nèi)聯(lián)的函數(shù)更有可能被內(nèi)聯(lián)。always_inline 屬性(節(jié) 5.17.2)會(huì)強(qiáng)制內(nèi)聯(lián)函數(shù)(這樣做是合法的)。也就是說,即使函數(shù)未聲明為內(nèi)聯(lián)且 --opt_level=0 或 --opt_level=1,pragma FUNC_ALWAYS_INLINE 也會(huì)強(qiáng)制函數(shù)內(nèi)聯(lián)。函數(shù)內(nèi)聯(lián)可以大大增加代碼大小:函數(shù)內(nèi)聯(lián)會(huì)增加代碼大小,尤其是內(nèi)聯(lián)在多個(gè)地方調(diào)用的函數(shù)。函數(shù)內(nèi)聯(lián)最適合僅從少數(shù)地方調(diào)用的函數(shù)以及小函數(shù)。
C 代碼中的 inline 關(guān)鍵字的語(yǔ)義遵循 C99 標(biāo)準(zhǔn)。C++ 代碼中的 inline 關(guān)鍵字的語(yǔ)義遵循 C++ 標(biāo)準(zhǔn)。
inline 關(guān)鍵字在所有 C++ 模式中、所有 C 標(biāo)準(zhǔn)的寬松 ANSI 模式中以及 C99 和 C11 的嚴(yán)格 ANSI 模式中都受支持。該關(guān)鍵字在 C89 的嚴(yán)格的ANSI 模式中被禁用,因?yàn)樗且环N可能與嚴(yán)格遵守標(biāo)準(zhǔn)的程序相沖突的語(yǔ)言擴(kuò)展。如果要在嚴(yán)格 ANSI C89 模式下定義內(nèi)聯(lián)函數(shù),請(qǐng)使用備用關(guān)鍵字 __inline。
影響內(nèi)聯(lián)的編譯器選項(xiàng)有:--opt_level、--auto_inline、--remove_hooks_when_inlining、--opt_for_speed 和 --disable_inlining。