关于Linux Kernel中的宏定义likely和unlikely
生活随笔
收集整理的這篇文章主要介紹了
关于Linux Kernel中的宏定义likely和unlikely
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在Linux kernel的源代碼中,經(jīng)常能見到if(likely(x))或if(unlikely(x))之類的用法,其確切含義需要說明一下,以便更好的理解kernel的源代碼。
likely與unlikely這兩個宏在linux/compiler.h中的定義如下:
#define likely(x)?? __builtin_expect(!!(x),1)
#define unlikely(x)?? __builtin_expect(!!(x),0)
很明顯,需要先弄清楚這個__builtin_expect()函數(shù)的意義。
__builtin_expect()是gcc的一個內(nèi)建函數(shù),其原型如下:
long __builtin_expect (long exp, long c);
記住該函數(shù)由GCC本身提供,用于優(yōu)化代碼。只中參數(shù)exp為任一表達式,c必須為常量值,其意義是在exp==c時,該函數(shù)返回非0值,意即希望exp==c。
回到likely和unlikely,likely實際是希望表達式x==1,即表達式x成立,并且在代碼實際執(zhí)行中,表達式x在絕大多數(shù)情況下是成立的,相反,unlikely是希望表達式在絕大多數(shù)情況下不成立,
如果有下列代碼:
if(unlikely(a > b) {
??? foo();
}
這段代碼的意思是,在絕大多數(shù)情況下a > b這個表達式是不成立的,不成立時執(zhí)行函數(shù)foo().
另外有一點要注意的是,由于likely定義時用的常量是1,unlikely用的常量是0,這正好符合c/c++語言中bool變量的實際值,而_builtin_expect()函數(shù)對exp與c進行嚴格相等的比較的,
因此使用likely和unlikely時,其參數(shù)應(yīng)該只使用邏輯表達式,因為邏輯表達式的值只有0或1。除非真要判斷某個變量的值是1或0時,才會將其它類型的參數(shù)傳給likely或unlikely。這一點可能很多人會不小心用錯。
使用這兩個宏定義的好處是優(yōu)化條件判斷
likely與unlikely這兩個宏在linux/compiler.h中的定義如下:
#define likely(x)?? __builtin_expect(!!(x),1)
#define unlikely(x)?? __builtin_expect(!!(x),0)
很明顯,需要先弄清楚這個__builtin_expect()函數(shù)的意義。
__builtin_expect()是gcc的一個內(nèi)建函數(shù),其原型如下:
long __builtin_expect (long exp, long c);
記住該函數(shù)由GCC本身提供,用于優(yōu)化代碼。只中參數(shù)exp為任一表達式,c必須為常量值,其意義是在exp==c時,該函數(shù)返回非0值,意即希望exp==c。
回到likely和unlikely,likely實際是希望表達式x==1,即表達式x成立,并且在代碼實際執(zhí)行中,表達式x在絕大多數(shù)情況下是成立的,相反,unlikely是希望表達式在絕大多數(shù)情況下不成立,
如果有下列代碼:
if(unlikely(a > b) {
??? foo();
}
這段代碼的意思是,在絕大多數(shù)情況下a > b這個表達式是不成立的,不成立時執(zhí)行函數(shù)foo().
另外有一點要注意的是,由于likely定義時用的常量是1,unlikely用的常量是0,這正好符合c/c++語言中bool變量的實際值,而_builtin_expect()函數(shù)對exp與c進行嚴格相等的比較的,
因此使用likely和unlikely時,其參數(shù)應(yīng)該只使用邏輯表達式,因為邏輯表達式的值只有0或1。除非真要判斷某個變量的值是1或0時,才會將其它類型的參數(shù)傳給likely或unlikely。這一點可能很多人會不小心用錯。
使用這兩個宏定義的好處是優(yōu)化條件判斷
總結(jié)
以上是生活随笔為你收集整理的关于Linux Kernel中的宏定义likely和unlikely的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: malloc分配空间必须首先初始化
- 下一篇: epoll机制