Je suis tombé sur un #definedans lequel ils utilisent __builtin_expect.
La documentation dit:
Fonction intégrée:
long __builtin_expect (long exp, long c)Vous pouvez utiliser
__builtin_expectpour 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.