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
用于优化条件分支预测,提升性能。适用于性能关键路径和错误处理等场景。使用时应基于实际条件概率,避免滥用。