Je suis tombé sur un #define
dans lequel ils utilisent __builtin_expect
.
La documentation dit:
Fonction intégrée:
long __builtin_expect (long exp, long c)
Vous pouvez utiliser
__builtin_expect
pour fournir au compilateur des informations de prédiction de branche. En général, vous devriez préférer utiliser les commentaires de profil réels pour cela (-fprofile-arcs
), car les programmeurs sont notoirement mauvais pour prédire les performances réelles de leurs programmes. Cependant, il existe des applications dans lesquelles ces données sont difficiles à collecter.La valeur de retour est la valeur de
exp
, qui doit être une expression intégrale. La sémantique du intégré est que cela est attenduexp == c
. Par exemple:if (__builtin_expect (x, 0)) foo ();
indiquerait que nous ne nous attendons pas à appeler
foo
, puisque nous nous attendonsx
à être à zéro.
Alors pourquoi ne pas utiliser directement:
if (x)
foo ();
au lieu de la syntaxe compliquée avec __builtin_expect
?
if ( x == 0) {} else foo();
.. ou tout simplement if ( x != 0 ) foo();
qui est équivalent au code de la documentation GCC.