Comme les autres réponses l'ont toutes suggérées de manière adéquate, vous pouvez utiliser __builtin_expect
pour donner au compilateur un indice sur la façon d'organiser le code d'assembly. Comme le soulignent les documents officiels , dans la plupart des cas, l'assembleur intégré à votre cerveau ne sera pas aussi bon que celui conçu par l'équipe GCC. Il est toujours préférable d'utiliser les données de profil réelles pour optimiser votre code, plutôt que de deviner.
Dans le même ordre d'idées, mais pas encore mentionné, il y a une manière spécifique à GCC de forcer le compilateur à générer du code sur un chemin "froid". Cela implique l'utilisation des attributs noinline
et cold
, qui font exactement ce qu'ils semblent faire. Ces attributs ne peuvent être appliqués qu'aux fonctions, mais avec C ++ 11, vous pouvez déclarer des fonctions lambda en ligne et ces deux attributs peuvent également être appliqués aux fonctions lambda.
Bien que cela tombe toujours dans la catégorie générale d'une micro-optimisation, et donc le conseil standard s'applique - testez ne pas deviner - je pense que c'est plus généralement utile que __builtin_expect
. Presque toutes les générations du processeur x86 utilisent des indices de prédiction de branche ( référence ), donc la seule chose que vous allez pouvoir affecter de toute façon est l'ordre du code d'assemblage. Puisque vous savez ce qu'est la gestion des erreurs ou le code de "cas de bord", vous pouvez utiliser cette annotation pour vous assurer que le compilateur ne prédira jamais une branche vers celui-ci et le liera loin du code "chaud" lors de l'optimisation de la taille.
Exemple d'utilisation:
void FooTheBar(void* pFoo)
{
if (pFoo == nullptr)
{
// Oh no! A null pointer is an error, but maybe this is a public-facing
// function, so we have to be prepared for anything. Yet, we don't want
// the error-handling code to fill up the instruction cache, so we will
// force it out-of-line and onto a "cold" path.
[&]() __attribute__((noinline,cold)) {
HandleError(...);
}();
}
// Do normal stuff
⋮
}
Mieux encore, GCC l'ignorera automatiquement en faveur des commentaires de profil lorsqu'il est disponible (par exemple, lors de la compilation avec -fprofile-use
).
Voir la documentation officielle ici: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes