Linux C/C++编程:likely和unlikely(__builtin_expect)

Linux C/C++编程:likely和unlikely(__builtin_expect)

看linux源码或者一些优秀组件的源码,经常碰到likely和unlikely, 其实很简单,无非就是显式告诉编译器怎么去优化。

#define likely(x)  __builtin_expect((x), 1)
#define unlikely(x)  __builtin_expect((x), 0)

使用

if( likely(val))  
if( unlikely (val))

那么为什么要这样用呢?

__builtin_expect() 是 GCC (version >= 2.96)提供给程序员使用的,目的是将“分支转移”的信息提供给编译器,这样编译器可以对代码进行优化,以减少指令跳转带来的性能下降。

__builtin_expect((x),1) 表示 x 的值为真的可能性更大;
__builtin_expect((x),0) 表示 x 的值为假的可能性更大;

也就是说,使用 likely() ,执行 if 后面的语句 的机会更大,使用unlikely(),执行else 后面的语句的机会更大。

例如下面这段代码,作者就认为 prev 不等于 next 的可能性更大,

if (likely(prev != next)) {
       next->timestamp = now;
        ...
} else {
        ...;
}

通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟着起面的代码,从而减少指令跳转带来的性能上的下降。

还有一个有趣的例子:

  • __builtin_expect(!!(x), 1) 这个是说,如果x == 0,那么结果就是 0,如果x == 1, 那么结果就是1,使用了!!是为了让x转化成bool型的

简言之:

if (likely(x)) {
   // 我觉得这里概率高
} else {
   // 我觉得这里概率低
}

其他: 在makefile.ac中定义:

if test "${GCC}" = "yes"; then
    AC_DEFINE([__always_unused], [__attribute__((unused))], [gcc unused attribute])
    AC_DEFINE([__maybe_unused], [__attribute__((unused))], [gcc unused attribute])
else
    AC_DEFINE([__always_unused], [], [dummy unused attribute])
    AC_DEFINE([__maybe_unused], [], [dummy unused attribute])
fi
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
__builtin_expect是GCC编译器提供给程序员使用的一个指令,用于提供分支转移的信息给编译器,以便进行代码优化,减少指令跳转带来的性能下降。\[3\]一般使用的方法是将__builtin_expect指令封装为likelyunlikely宏,用于表示某个条件的可能性更大或更小。例如,likely(x)表示x的值为真的可能性更大,而unlikely(x)表示x的值为假的可能性更大。\[2\]通过在代码中使用likelyunlikely宏,编译器可以在编译过程中将可能性更大的代码紧跟在前面的代码,从而减少指令跳转带来的性能下降。\[3\]这样的优化可以提高程序的执行效率。 #### 引用[.reference_title] - *1* [__builtin_xxx指令学习【1】__builtin_expect](https://blog.csdn.net/qq_42604176/article/details/130031135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【编程基础の基础】__builtin_expect详解(汇编级解释)](https://blog.csdn.net/weixin_42157432/article/details/115805804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值