Heng30的博客
搜索 分类 关于 订阅

Linux中的likely和unlikely函数有什么用?

2025-02-20

Linux内核中,likelyunlikely是用于优化条件分支预测的宏,定义在compiler.h头文件中。它们通过提示编译器某个条件更可能为真或假,帮助生成更高效的代码。

  • likely宏:提示编译器条件表达式很可能为真。
#define likely(x) __builtin_expect(!!(x), 1)
  • unlikely宏:提示编译器条件表达式很可能为假。
#define unlikely(x) __builtin_expect(!!(x), 0)

原理

  • __builtin_expectGCC内置函数,用于优化分支预测。

  • __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;
}

总结

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