Les codes fantastiques : une prédiction exceptionnelle

Magazine
Marque
GNU/Linux Magazine
Numéro
263
Mois de parution
mai 2023
Spécialité(s)


Résumé

Continuons cette série sur les codes fantastiques avec un code exceptionnel et inattendu


Body

Lors d’une relecture de code autour de l’attribut [[likely]] (introduit en C++20 pour marquer le test d’une branche qui a de fortes chances de s’évaluer à vrai), je me suis rendu compte d’un choix amusant fait par le compilateur Clang quand il compile une branche qui lève une exception. Mais commençons par le commencement. Le code suivant :

int bar();
int foo(bool val) {
  if(val)
    return bar();
  return 1;
}

est traduit par Clang (avec le drapeau -O2) en l’assembleur que voici :

foo(bool):
        test    edi, edi
        je      .LBB0_1
        jmp     bar()@PLT
.LBB0_1:
        mov     eax, 1
        ret

Cet agencement du code favorise le cas où val est vrai (exécution plus rapide, car pas de sauts, meilleure localité dans le cache d’instruction, etc.).

Cependant, si au lieu de retourner la valeur produite par bar, on l’utilise pour lever une exception :

int foo(bool val) {
  if(val)
    throw bar();
  return 1;
}

Le compilateur considère que la branche qui lève une exception est... exceptionnelle, donc peu probable et il favorisera alors l’autre branche, et il génère alors l’assembleur suivant :

        ...
        test    edi, edi
        jne     .LBB0_1
        mov     eax, 1
        ...

On peut rendre la branche vraie à nouveau plus probable en lui attachant l’attribut [[likely]] et notre exception redevient plus probable, ce qui reste un peu contraire à l’usage canonique d’une exception :

int foo(bool val) {
  if(val) [[likely]]
    throw bar();
  return 1;
}

Il reste intéressant de voir que le compilateur Clang possède une heuristique de prédiction de branchement pour le traitement des exceptions, et qu’on peut reprendre la main tout en restant sur des attributs standard ! Pour les curieux, je vous laisse tester GCC sur le même code, les heuristiques sont différentes :-).



Article rédigé par

Par le(s) même(s) auteur(s)

Crévindiou, c’est pas du bon C d’chez nous ça, cé du C deu’l ville !

Magazine
Marque
GNU/Linux Magazine
Numéro
267
Mois de parution
janvier 2024
Spécialité(s)
Résumé

IANAL (I Am Not A Linguist), mais quand j’entends du québécois, je ne comprends pas tout, mais je comprends. Mais qu’en est-il des dialectes du langage C ? Car oui, le langage C a des dialectes, et nous allons voyager un peu à travers l’un d’entre eux, le dialecte GNU, supporté principalement par GCC, mais aussi, en partie, par Clang.

Les derniers articles Premiums

Les derniers articles Premium

Bénéficiez de statistiques de fréquentations web légères et respectueuses avec Plausible Analytics

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Pour être visible sur le Web, un site est indispensable, cela va de soi. Mais il est impossible d’en évaluer le succès, ni celui de ses améliorations, sans établir de statistiques de fréquentation : combien de visiteurs ? Combien de pages consultées ? Quel temps passé ? Comment savoir si le nouveau design plaît réellement ? Autant de questions auxquelles Plausible se propose de répondre.

Quarkus : applications Java pour conteneurs

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Initié par Red Hat, il y a quelques années le projet Quarkus a pris son envol et en est désormais à sa troisième version majeure. Il propose un cadre d’exécution pour une application de Java radicalement différente, où son exécution ultra optimisée en fait un parfait candidat pour le déploiement sur des conteneurs tels que ceux de Docker ou Podman. Quarkus va même encore plus loin, en permettant de transformer l’application Java en un exécutable natif ! Voici une rapide introduction, par la pratique, à cet incroyable framework, qui nous offrira l’opportunité d’illustrer également sa facilité de prise en main.

De la scytale au bit quantique : l’avenir de la cryptographie

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Imaginez un monde où nos données seraient aussi insaisissables que le célèbre chat de Schrödinger : à la fois sécurisées et non sécurisées jusqu'à ce qu'un cryptographe quantique décide d’y jeter un œil. Cet article nous emmène dans les méandres de la cryptographie quantique, où la physique quantique n'est pas seulement une affaire de laboratoires, mais la clé d'un futur numérique très sécurisé. Entre principes quantiques mystérieux, défis techniques, et applications pratiques, nous allons découvrir comment cette technologie s'apprête à encoder nos données dans une dimension où même les meilleurs cryptographes n’y pourraient rien faire.

Les listes de lecture

9 article(s) - ajoutée le 01/07/2020
Vous désirez apprendre le langage Python, mais ne savez pas trop par où commencer ? Cette liste de lecture vous permettra de faire vos premiers pas en découvrant l'écosystème de Python et en écrivant de petits scripts.
11 article(s) - ajoutée le 01/07/2020
La base de tout programme effectuant une tâche un tant soit peu complexe est un algorithme, une méthode permettant de manipuler des données pour obtenir un résultat attendu. Dans cette liste, vous pourrez découvrir quelques spécimens d'algorithmes.
10 article(s) - ajoutée le 01/07/2020
À quoi bon se targuer de posséder des pétaoctets de données si l'on est incapable d'analyser ces dernières ? Cette liste vous aidera à "faire parler" vos données.
Voir les 64 listes de lecture

Abonnez-vous maintenant

et profitez de tous les contenus en illimité

Je découvre les offres

Déjà abonné ? Connectez-vous