2025-02-20
在Linux内核中,likely和unlikely是用于优化条件分支预测的宏,定义在compiler.h头文件中。它们通过提示编译器某个条件更可能为真或假,帮助生成更高效的代码。
likely宏:提示编译器条件表达式很可能为真。#define likely(x) __builtin_expect(!!(x), 1)
unlikely宏:提示编译器条件表达式很可能为假。#define unlikely(x) __builtin_expect(!!(x), 0)
__builtin_expect:GCC内置函数,用于优化分支预测。
__builtin_expect(exp, c)提示编译器exp的值很可能为c。
!!(x):将x转换为布尔值(0 或 1)。
通过提示编译器条件分支的走向,减少CPU流水线中的分支预测错误,提升性能。编译器会根据提示重新排列代码,将更可能执行的代码放在主路径上,减少跳转。
性能关键路径:在需要极致优化的代码中使用,如内核中的高频执行路径。
错误处理:将错误处理代码标记为 unlikely,因为错误通常较少发生。
#include <stdio.h>
#include <compiler.h>
int main(void) {
int x = 10;
if (likely(x == 10)) {
printf("x is likely 10\n");
} else {
printf("x is unlikely not 10\n");
}
if (unlikely(x != 10)) {
printf("x is unlikely not 10\n");
} else {
printf("x is likely 10\n");
}
return 0;
}
likely和unlikely用于优化条件分支预测,提升性能。适用于性能关键路径和错误处理等场景。使用时应基于实际条件概率,避免滥用。