likely和unlikely是两个宏,当有if-else分支时告诉编译器,哪个条件更加有可能发生。likely代表if分支大概率会发生,unlikely代表if分支大概率不会发生。 #definelikely(x) __builtin_expect(!!(x), 1) #defineunlikely(x) __builtin_expect(!!(x), 0) __builtin_expect是编译器内建函数,原型为long __built...
在单片机/嵌入式编程中,对速度要求比较高,likely和unlikely就是一个比较好的技巧,适用于有if-else分支,且知道哪个发生概率大的情况。 1.likely和unlikely 这是两个宏,当有if-else分支时,告诉编译器,哪个条件更加有可能发生。对if-else分支结构进行优化。likely代表if分支大概率会发生,unlikely代表if分支大概率不会发...
如果使用likely和unlikely来告诉编译器,哪个更加有可能发生,编译器将大概率执行的代码放在靠前的位置,就可以大大提高指令预取值的命中率,从而达到提升效率的目的。
unlikely.cpp: 1#include<stdio.h>2#include<stdlib.h>34#definelikely(x) __builtin_expect(!!(x), 1)//gcc内置函数, 帮助编译器分支优化5#defineunlikely(x) __builtin_expect(!!(x), 0)67intmain(intargc,char*argv[]){8intx =0;9x = atoi(argv[1]);1011if(unlikely(x ==3)){//告诉...
CC++分支预测(likelyunlikely)CC++分⽀预测(likelyunlikely)看⼀些代码时,会遇到likely unlikely, 查了查⽹上的资料,结合⾃⼰的理解记录⼀下。1. ⼀些概念 指令周期是指执⾏⼀条指令所需要的时间,⼀般由若⼲个组成,是从取指令、分析指令到指令执⾏完所需的全部。 预取指令具体...
这个指令是gcc引入的,作用是"允许程序员将最有可能执行的分支告诉编译器"。这个指令的写法为:__builtin_expect(EXP, N)。意思是:EXP==N的概率很大。一般的使用方法是将__builtin_expect指令封装为LIKELY和UNLIKELY宏。 四、C语言中常用的预定义 __LINE__:当前程序行的行号,表示为十进制整型常量 ...
[[likely]] 和 [[unlikely]] [[no_unique_address]] 接下来我将尝试对已经引入标准的属性进行进一步的说明,同时对于已经明确得到编译器支持的属性,我也会尝试用例子进行进一步的探索,希望抛砖引玉能够帮大家更好的使用C++属性这个“新的老朋友”。 1 [[noreturn]] ...
constexpr long long fact(long long n) noexcept {if (n > 1) [[likely]]return n * fact(n - 1);else [[unlikely]]return 1;} lambda表达式的捕获 C++20之前[=]会隐式捕获this,而C++20需要显式捕获,这样[=, this] struct S2 { void f(int i); };void S2::f(int i){ [=]{}; // ...
内核中已经实现一些相关的宏,如likely和unlikely,用来提醒程序员优化程序。 Linux内核中的likely和unlikely 在Linux内核中,使用__builtin_expect()内建函数,定义了两个宏。 #define likely(x) __builtin_expect(!!(x),1);#define unlikely(x) __builtin_expect(!!(x),0); ...
若代码中出现分支,则即可能中断流水线,我们可以通过likely和unlikely暗示分支容易成立还是不容易 成立,例如: if(likely(!IN_DEV_ROUTE_LOCALNET(in_dev))) if(ipv4_is_loopback(saddr)) gotoe_inval; 在使用gcc编译C程序的时候,如果使用“-ansi–pedantic”编译选项,则会告诉编译器不使用GNU扩展语法。例如对 于...