可能/不太可能的宏可用于用户空间代码吗?

时间:2009-11-03 15:25:04

标签: c linux gcc optimization likely-unlikely

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

3 个答案:

答案 0 :(得分:41)

是的,他们可以。 In the Linux kernel,它们被定义为

#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

如果您使用它进行正确的分支预测,它肯定会给您优化。

答案 1 :(得分:10)

在“6.2.2优化1级指令缓存访问”下查看What Every Programmer Should Know About Memory - 这里有一个关于此的部分。

答案 2 :(得分:4)

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