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