日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

关于Linux Kernel中的宏定义likely和unlikely

發布時間:2025/3/21 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Linux Kernel中的宏定义likely和unlikely 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Linux kernel的源代碼中,經常能見到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()函數的意義。
__builtin_expect()是gcc的一個內建函數,其原型如下:
long __builtin_expect (long exp, long c);
記住該函數由GCC本身提供,用于優化代碼。只中參數exp為任一表達式,c必須為常量值,其意義是在exp==c時,該函數返回非0值,意即希望exp==c。
回到likely和unlikely,likely實際是希望表達式x==1,即表達式x成立,并且在代碼實際執行中,表達式x在絕大多數情況下是成立的,相反,unlikely是希望表達式在絕大多數情況下不成立,
如果有下列代碼:
if(unlikely(a > b) {
??? foo();
}
這段代碼的意思是,在絕大多數情況下a > b這個表達式是不成立的,不成立時執行函數foo().
另外有一點要注意的是,由于likely定義時用的常量是1,unlikely用的常量是0,這正好符合c/c++語言中bool變量的實際值,而_builtin_expect()函數對exp與c進行嚴格相等的比較的,
因此使用likely和unlikely時,其參數應該只使用邏輯表達式,因為邏輯表達式的值只有0或1。除非真要判斷某個變量的值是1或0時,才會將其它類型的參數傳給likely或unlikely。這一點可能很多人會不小心用錯。
使用這兩個宏定義的好處是優化條件判斷

總結

以上是生活随笔為你收集整理的关于Linux Kernel中的宏定义likely和unlikely的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。