請(qǐng)閱讀【ARM GCC 編譯專欄導(dǎo)讀】
上篇文章:ARM 嵌入式 編譯系列 4 – GCC 編譯屬性 __read_mostly 介紹
下篇文章: ARM 嵌入式 編譯系列 4.2 – GCC 鏈接規(guī)范 extern “C“ 介紹
GCC likely與unlikely 介紹
likely 和 unlikely 是GCC編譯器提供的一種代碼優(yōu)化特性,這兩個(gè)宏用于告訴編譯器某個(gè)條件判斷的結(jié)果是真還是假的可能性更大。
在編寫(xiě)代碼時(shí),如果我們已經(jīng)知道某個(gè)條件判斷的結(jié)果大部分情況下都是真或者假,就可以使用likely
和unlikely
宏來(lái)進(jìn)行標(biāo)記,編譯器會(huì)根據(jù)這個(gè)提示進(jìn)行優(yōu)化,使得代碼運(yùn)行更高效。
以下是這兩個(gè)宏的定義:
#define likely(x) __builtin_expect((x), 1)
#define unlikely(x) __builtin_expect((x), 0)
這里的__builtin_expect
是 GCC
的內(nèi)建函數(shù),用于提供編譯器關(guān)于表達(dá)式結(jié)果的預(yù)期值。
以下是如何在代碼中使用這兩個(gè)宏的:
if (likely(x > 0)) {
// 大部分情況下,x都大于0
} else {
// 一般情況下,這里的代碼不會(huì)執(zhí)行
}
if (unlikely(err != 0)) {
// 一般情況下,err都等于0,所以這里的代碼很少執(zhí)行
}
在這兩個(gè)示例中,likely
和unlikely
宏標(biāo)記了條件判斷的結(jié)果預(yù)期,這樣編譯器在生成機(jī)器代碼時(shí),可以將更可能執(zhí)行的代碼放在內(nèi)存中的靠前位置,從而提高代碼執(zhí)行效率。
linux 內(nèi)核中的 likely/unlikely
這兩個(gè)宏在內(nèi)核中的定義如下:
# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
可見(jiàn)這里使用了 gcc 的內(nèi)建函數(shù) __builtin_expect()
。
__builtin_expect (long exp, long c)
函數(shù):
該函數(shù)用來(lái)引導(dǎo) gcc 進(jìn)行條件分支預(yù)測(cè)。在一條指令執(zhí)行時(shí),由于流水線的作用,CPU可以同時(shí)完成下一條指令的取指,這樣可以提高CPU的利用率。在執(zhí)行條件分支指令時(shí),CPU也會(huì)預(yù)取下一條執(zhí)行,但是如果條件分支的結(jié)果為跳轉(zhuǎn)到了其他指令,那 CPU 預(yù)取的下一條指令就沒(méi)用了,這樣就降低了流水線的效率。
另外,跳轉(zhuǎn)指令相對(duì)于順序執(zhí)行的指令會(huì)多消耗 CPU 時(shí)間,如果可以盡可能不執(zhí)行跳轉(zhuǎn),也可以提高 CPU 性能。
使用 __builtin_expect (long exp, long c)
函數(shù)可以幫助 gcc 優(yōu)化程序編譯后的指令序列,使匯編指令盡可能的順序執(zhí)行,從而提高 CPU 預(yù)取指令的正確率和執(zhí)行效率。
__builtin_expect(exp, c)
接受兩個(gè) long
型的參數(shù),用來(lái)告訴 gcc:exp==c
的可能性比較大。
例如,__builtin_expect(exp, 1)
表示程序執(zhí)行過(guò)程中,exp 取到 1 的可能性比較大。該函數(shù)的返回值為 exp 自身。
內(nèi)核中 likely(x)
和 unlikely(x)
宏:
知道 __builtin_expect()
函數(shù)的作用之后,我們就知道內(nèi)核中 likely(x)
和 unlikely(x)
宏的作用了,通過(guò) likely(x)
和 unlikely(x)
宏定義,我們可以得出他們的作用:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-655837.html
-
likely(x) 等價(jià)于 x,即
if (likely(x))
等價(jià)于if (x)
,但是它告訴 gcc,x 取 1 的可能性比較大; -
unlikely(x) 等價(jià)于 x,即
if (unlikely(x))
等 價(jià)于if (x)
,但是它告訴 gcc,x 取 0 的可能性比較大。
上篇文章:ARM 嵌入式 編譯系列 4 – GCC 編譯屬性 __read_mostly 介紹
下篇文章: ARM 嵌入式 編譯系列 4.2 – GCC 鏈接規(guī)范 extern “C“ 介紹文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-655837.html
到了這里,關(guān)于【ARM 嵌入式 編譯系列 4.1 -- GCC 編譯屬性 likely與unlikely 學(xué)習(xí)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!