分支声明likely()/unlikely()

本文深入探讨了GCC内建的likely()和unlikely()宏在优化条件语句分支上的应用,解释了如何通过合理使用这些宏来提升程序性能,并强调了在使用时必须准确判断条件的可能性。

分支声明likely()/unlikely()

    对于条件语句,gcc内建了一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候,编译器可以根据这条指令对条件分支进行优化。内核把这条指令封装成了宏,比如likely()和unlikely(),这样使用起来比较方便。

    例如,下面是一个条件选择语句:
    if (error) {
        /* ... */        
    }

    如果想把这个选择标记成绝少发生的分支:
    /* 我们认为error绝大多数情况下都会为0 */
    if (unlikely(error)) {
        /* ... */
    }

    相反,如果我们想把一个分支标记为通常为真的分支:
    /* 我们认为success通常都不会为0 */
    if (likely(success)) {
        /* ... */    
    }        
    

    在你想要对某个条件选择语句进行优化之前,一定要搞清楚其中是不是存在这么一个条件,在绝大多数情况下都会成立。这点十分重要;如果你的判断正确,确实是这个条件占压倒性的地位,那么性能会得到提升;如果你搞错了,性能反而会下降。正如上面这些例子所示,通常在对一些错误条件进行判断的时候会用到unlikely()和likely()。你可以猜到,unlikely()在内核中会得到更广泛的使用,因为if语句往往判断的是一种特殊情况。


特此声明,以上内容摘自《linux内核设计与实现》第三版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值