likely与unlikely

本文详细介绍了C++中用于优化条件分支的`likely`和`unlikely`宏,它们通过预判条件分支的执行概率,帮助编译器优化代码执行路径,提高处理器流水线效率。在表达式为真可能性大的情况下使用`likely`,反之使用`unlikely`。这两个宏可以提升条件判断的预测准确性,从而减少指令跳转带来的性能损失。常见应用场景包括在条件判断中使用,以指导编译器优化代码流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统中.../include/linux/compiler.h定义

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

看了其他博客,只说明了这个宏的作用,优化流程,没有说明一点就是:

if(likely(x)) 等价于 if(x)
if(unlikely(x)) 等价于 if(x)

 likely或者unlikely都是在X表达式为真时返回1。

 优化原理:

       现在处理器都是流水线的,有些里面有多个逻辑运算单元,系统可以提前取多条指令进行并行处理,但遇到跳转时,则需要重新取指令,这相对于不用重新去指令就降低了速度。 
      所以就引入了 likely 和 unlikely ,目的是增加条件分支预测的准确性,cpu 会提前装载后面的指令,遇到条件转移指令时会提前预测并装载某个分 支的指令。unlikely 表示你可以确认该条件是极少发生的,相反 likely 表示该条件多数情况下会发生。编译器会产生相应的代码来优化 cpu 执行效率。

       也就是说,使用 likely() ,执行 if 后面的语句 的机会更大,使用 unlikely(),执行 else 后面的语句的机会更大。通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟着起面的代码,从而减少指令跳转带来的性能上的下降。

应用场景:

   表达式为假的可能性大,用unlikely


int main()
{
    int x = 2;
    if (unlike(x < 1))
    {
        printf("此分支执行的可能性极小\n");
    }
    else
    {
        printf("cpu提前获取else分支\n");
    }

    return 0;
}

  表达式为真的可能性大,用unlikely

int main()
{
    int x = 0;
    if (unlike(x < 1))
    {
        printf("cpu提前获取if分支\n");
    }
    else
    {
        printf("此分支执行的可能性极小\n");
    }

    return 0;
}

 

分析:个人觉得likely、unlikely有一个就可以,如果表达式可能为假(x<2),如果不想使用unlikely,直接表达式取反,likely(x>=2)就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值