I came across a #define
in which they use __builtin_expect
.
The documentation says:
Built-in Function:
long __builtin_expect (long exp, long c)
You may use
__builtin_expect
to provide the compiler with branch prediction information. In general, you should prefer to use actual profile feedback for this (-fprofile-arcs
), as programmers are notoriously bad at predicting how their programs actually perform. However, there are applications in which this data is hard to collect.The return value is the value of
exp
, which should be an integral expression. The semantics of the built-in are that it is expected thatexp == c
. For example:if (__builtin_expect (x, 0)) foo ();
would indicate that we do not expect to call
foo
, since we expectx
to be zero.
So why not directly use:
if (x)
foo ();
instead of the complicated syntax with __builtin_expect
?