C/C++ 中的分支预测likely and unlikely

本文介绍了GCC内置函数__builtin_expect用于分支预测优化的概念,通过预取指令提高CPU效率。代码示例展示了如何在C程序中使用__builtin_expect标记不太可能发生(unlikely)和很可能发生(likely)的条件,从而帮助编译器优化执行路径。

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

最近在三维点云数据处理中遇到了如下的代码,通过查阅网上资料,小有了解,随便记录一下,并于后面好好的研究。

#ifndef likely
# if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 296)
#  define likely(x)   (__builtin_expect((x), 1))
#  define unlikely(x) (__builtin_expect((x), 0))
# else
#  define likely(x) (x)
#  define unlikely(x) (x)
# endif
#endif

1.基本概念

指令周期是指执行一条指令所需要的时间,一般由若干个机器周期组成,是从取指令、分析指令到指令执行完所需的全部。

预取指令具体方法就是在不命中时,当数据从主存储器中取出送往CPU的同时,把主存储器相邻几个单元中的数据(称为一个数据块)都取出来送入Cache中。预取指令可以更好的利用 cpu资源。简单说就是从内存取指令很慢, cpu要等待这个过程。如果能提前预测可能执行的指令,就提前从内存把指令读到 cache, 由于 cache的访问速度较内存快,cpu要执行时就不用等很长时间了。 如果开发人员可以告诉编译器,哪个分支更有可能发生(likely) 或者 非常不可能发生(unlikely), 可以帮助编译器进行代码编译

2.代码

​
#include<stdio.h>
#include<stdlib.h>

#define likely(x) __builtin_expect(!!(x), 1) //gcc内置函数, 帮助编译器分支优化
#define unlikely(x) __builtin_expect(!!(x), 0)

int main(int argc, char* argv[]){
    int x = 0;
    x = atoi(argv[1]);

    if (unlikely(x == 3)){  //告诉编译器这个分支非常不可能为true
        x = x + 9;
    }
    else{
        x = x - 8;
    }

    printf("x=%d\n", x);
    return 0;
}

​

3.代码分析

https://blog.youkuaiyun.com/npy_lp/article/details/7175517

https://www.cnblogs.com/xudong-bupt/p/7337240.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云SLAM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值