首页 > 其他分享 >C语言 likely和unlikely

C语言 likely和unlikely

时间:2023-10-15 09:12:08浏览次数:31  
标签:__ 编译器 C语言 likely 指令 unlikely

likely和unlikely作用

在知道哪个发生概率更高的情况下,有if时使用likely和unlikely让代码运行更快。
likely和unlikely是两个宏,当有if-else分支时告诉编译器,哪个条件更加有可能发生。likely代表if分支大概率会发生,unlikely代表if分支大概率不会发生。

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

__builtin_expect是编译器内建函数,原型为long __builtin_expect (long exp, long c)。

a>100不太可能发生写法

int fun(int a)
{
  if (unlikely(a>100))
  ......
}

1.likely和unlikely使用判断必须准确,写反会使运行速度变慢。
2.编译时优化一般需要至少使用-O2选项,否则优化不起作用。
3.能否使用与编译器有关,gcc可以。

!!作用

!!是C语言中处理逻辑表达式的一个技巧。因为C语言中没有布尔变量,所以布尔值是用整形来代替的,0为假,非0为真。当x为0时,!(x)为1,!!(x)为0,!!的运算没有什么意义;但当x为非0时(比如100),!(x)为0,!!(x)为1,这样就达到了将非0值(比如100)全部都映射为1的效果。

原理

从跳转指令角度来说,编译器在编译生成汇编代码时会在编译选项的引导下调整if分支内代码的位置,likely修饰的调整到前面,unlikely修饰的调整到后面,节省跳转指令带来的时间开销。
从预取指令角度来说,CPU在运行当前这条指令时,ICache会预取后面的指令,提升效率。如果条件分支不满足,跳转到了其他指令,那么预取的指令就没有用了,降低流水线的效率。当编译器将大概率执行的代码放在靠前的位置,可以提高指令预取值的命中率,提升效率。

参考资料

C语言技巧:有if时使用likely和unlikely让代码运行更快

标签:__,编译器,C语言,likely,指令,unlikely
From: https://www.cnblogs.com/WJQ2017/p/17765229.html

相关文章

  • 学习C语言心得-自定义函数-每调用一次函数 num的值+1
    每调用一次函数num的值+1#include<stdio.h>NUM(int*num){ (*num)++;}intmain(){ intnum=0; NUM(&num); printf("%d\n",num); NUM(&num); printf("%d\n",num); NUM(&num); printf("%d\n",num); NUM(&num)......
  • 学习C语言心得-嵌套函数-最简单的嵌套调用
    嵌套调用#include<stdio.h>firet(){ printf("hehe\n");}second(){ inti=0; for(i=0;i<3;i++) { firet(); }}intmain(){ second(); return0;}运行结果:......
  • 学习C语言心得-自定义函数-对整形有序数组进行二分查找-二分法
    对整形有序数组进行二分查找#include<stdio.h>intfind(intarr[],intsz,intk){ intleft=0;intright=sz-1; while(left<=right) { intmid=left+right/2; if(k>arr[mid]) { left=mid+1; } if(k<arr[mid]) { right=mid......
  • 初识C语言
    什么是C语言?C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。......
  • C语言预处理和宏
    C语言预处理和宏预处理命令预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。这些在编译之前对源文件进行简单加工的过程,就称为预处理。预处理阶段的工作:把代码当......
  • 萌新学习c语言记录
    今天写的题要求使用while语句发现输出一直循环一直循环着最后一个数然后看别人的答案发现要这样做然后我搜索了一下发现while(scanf("%d",&a)!=EOF)可以检查输入是否成功如果不输入的话将不会进行下一步......
  • 学习C语言心得-自定义函数 输入两个数字求和
    输入两个数字求和#include<stdio.h>intsum(inta,intb){ returna+b;}intmain(){ inta=0; intb=0; printf("请输入ab的值:"); scanf("%d%d",&a,&b); intSum=sum(a,b); printf("Sum=%d",Sum); return0;}运行......
  • 学习C语言心得-传址调用
    运用传址调用来交换两个数#include<stdio.h>inttransform(int*a,int*b){ intx=0; x=*a; *a=*b; *b=x;}intmain(){ inta=10; intb=20; printf("交换前:%d%d\n",a,b); transform(&a,&b); printf("交换后:%d%d\n",......
  • 学习C语言心得-运用自定义函数求素数
    自定义函数求素数#include<stdio.h>intpanduan(inta){ inti=0; for(i=2;i<a;i++) { if(a%i==0) { returna; } } return0;}intmain(){ intnumber=0; printf("请输入一个数:"); scanf("%d",&number); int......
  • c语言代码练习(无符号整数)29
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<windows.h>intmain(){unsignedinti;for(i=9;i>=0;i--){printf("%u\n",i);Sleep(100);}return0;}死循环,因为无符号整数,没有负数......