vin*_*rak 25 c linux optimization gcc likely-unlikely
我在Linux内核代码中遇到了这两个宏.我知道它们是编译器(gcc)的指令,用于在分支的情况下进行优化.我的问题是,我们可以在用户空间代码中使用这些宏吗?它会进行任何优化吗?任何例子都会非常有用.
Tom*_*mas 41
是的他们可以.在Linux内核中,它们被定义为
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
Run Code Online (Sandbox Code Playgroud)
__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
Run Code Online (Sandbox Code Playgroud)
如果您使用它进行正确的分支预测,它肯定会给您优化.