Mi sono imbattuto in un #define
in cui usano __builtin_expect
.
La documentazione dice:
Funzione integrata:
long __builtin_expect (long exp, long c)
È possibile utilizzare
__builtin_expect
per fornire al compilatore informazioni sulla previsione del ramo. In generale, dovresti preferire utilizzare il feedback del profilo effettivo per questo (-fprofile-arcs
), poiché i programmatori sono notoriamente cattivi nel predire il rendimento effettivo dei loro programmi. Tuttavia, ci sono applicazioni in cui questi dati sono difficili da raccogliere.Il valore restituito è il valore di
exp
, che dovrebbe essere un'espressione integrale. La semantica del built-in è che ci si aspetta cheexp == c
. Per esempio:if (__builtin_expect (x, 0)) foo ();
indicherebbe che non prevediamo di chiamare
foo
, poiché prevediamox
di essere pari a zero.
Quindi perché non usare direttamente:
if (x)
foo ();
invece della complicata sintassi con __builtin_expect
?
if ( x == 0) {} else foo();
... o semplicemente if ( x != 0 ) foo();
equivalente al codice della documentazione di GCC.