26

我在 Linux 内核代码中遇到了这两个宏。我知道它们是编译器(gcc)的指令,用于在分支的情况下进行优化。我的问题是,我们可以在用户空间代码中使用这些宏吗?它会进行任何优化吗?任何示例都会非常有帮助。

4

3 回答 3

44

是的他们可以。在 Linux 内核中,它们被定义为

#define likely(x)       __builtin_expect(!!(x), 1)
#define unlikely(x)     __builtin_expect(!!(x), 0)

__builtin_expect 宏是使用分支预测的 GCC 特定宏;它们告诉处理器某个条件是否可能为真,以便处理器可以在分支的正确“一侧”预取指令。

您应该将定义包装在 ifdef 中以确保在其他编译器上进行编译:

#ifdef __GNUC__
#define likely(x)       __builtin_expect(!!(x), 1)
#define unlikely(x)     __builtin_expect(!!(x), 0)
#else
#define likely(x)       (x)
#define unlikely(x)     (x)
#endif

如果您将其用于正确的分支预测,它肯定会给您带来优化。

于 2009-11-03T15:32:04.433 回答
12

在“6.2.2 优化 1 级指令缓存访问”下查看每个程序员应该了解的关于内存的知识- 有一节正是关于这一点的。

于 2009-11-03T15:38:46.237 回答
4

可能()和不可能()宏是在内核头文件中定义的漂亮名称,用于真正gcc 功能

于 2009-11-03T15:30:33.313 回答