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

最佳答案

是的他们可以。 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

如果将其用于正确的分支预测,它将一定为您提供优化。

关于c - 可以/不太可能在用户空间代码中使用宏吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1668013/

10-17 01:54