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

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

#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.csdn.net/npy_lp/article/details/7175517

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

猜你喜欢

转载自blog.csdn.net/qq_36812406/article/details/83052163