C语言技巧:有if时使用likely和unlikely让代码运行更快
#definelikely(x)__builtin_expect(!!(x),1)#defineunlikely(x)__builtin_expect(!!(x),0) __builtin_expect是编译器内建函数,原型为long __builtin_expect (long exp, long c)。 题外话: !!是C语言中处理逻辑表达式的一个技巧。因为C语言中没有布尔变量,所以布尔值是用整形来代替的,0为假,非0为...
2. __builtin_expect是编译器内建函数,原型为long __builtin_expect (long exp, long c)。 题外话: !!是C语言中处理逻辑表达式的一个技巧。因为C语言中没有布尔变量,所以布尔值是用整形来代替的,0为假,非0为真。当x为0时,!(x)为1,!!(x)为0,!!的运算没有什么意义;但当x为非0时(比如100),!(...
c likely用法 "C likely" 在 C 语言中并不是一个标准的表达式或函数。我猜您可能是想问关于 "likely" 和 "unlikely" 的用法,这两个宏通常在 C 和 C++ 的内核编程和其他性能关键的代码中使用,用于提供分支预测提示给编译器。编译器可以根据这些提示来优化代码,以便更好地预测分支的结果,并相应地重新排序指令...
在c语言当中!(x)取反,!!(x)在取反的基础上再次取反,不同的是假设x = 100, !(x) =0, !!(x) = 1,进一步分析假设X= -1; !(x) = 1, !!(x) = 0;这样无论输入的参数是多少结果就变成了bool值true, false。 You may use__builtin_expectto provide the compiler with branch prediction info...
#include<cstdio>#definelikely(x) __builtin_expect(!!(x), 1)#defineunlikely(x) __builtin_expect(!!(x), 0)intmain(intargc,char*argv[]){if(unlikely(argc >0)) {puts("Positive\n"); }else{puts("Zero or Negative\n"); }return0; ...
可以看到,反汇编完全是按照C语言逻辑走的,一五一十,按部就班,上面的优化宏没有起到任何作用。 下面先用-O1看看效果。GCC对-O和-O1的描述是:the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time. ...
我们一般都知道,C语言由源码变成可以运行的可执行文件包括四个阶段,分别是: -预处理阶段(预处理器) -编译阶段(编译器) -汇编阶段(汇编器) -链接阶段(链接器) 以我写的下面这个C代码likely.c文件为例: 具体过程见下图: 我们使用objdump命令:objdump -S likely.o,看一下likely.o的汇编指令: 在这个过程中,gcc...
911e4000 add x0, x0, #0x790 400618: b9402fa1 ldr w1, [x29, #44]40061c: 97ffffa5 bl 4004b0 <printf@plt> 400620: d503201f nop 400624: a8c37bfd ldp x29, x30, [sp], #48 400628: d65f03c0 ret ...
#ifndef likely #define likely(x) __builtin_expect(!!(x), 1)//表示x的值为真的可能性更大 #endif /* likely */ #ifndef unlikely #define unlikely(x) __builtin_expect(!!(x), 0) //表示x的值为假的可能性更大 #endif /* unlikely */ ...