Les codes fantastiques : co-vide

Magazine
Marque
GNU/Linux Magazine
Numéro
268
Mois de parution
mars 2024
Spécialité(s)


Résumé

Continuons cette série sur les codes fantastiques avec les classes vides de C++


Body

Quand on apprend que la taille (au sens de sizeof) d’une structure vide en C++ est de un octet, on est souvent un peu surpris. Puis on comprend que tout objet pouvant avoir une adresse, un objet ne peut avoir une taille vide (imaginez le bazar : un tableau de structure vide serait lui-même vide et tous les objets auraient la même adresse).

La plupart du temps, le compilateur arrive à « optimiser » le code associé, principalement quand il peut prouver que l’adresse de l’objet n’est jamais prise. Mais ce n’est pas le cas de la situation suivante :

struct empty {
  void doit() const;
};
 
void pain() {
  empty e;
  e.doit();
}

Le code optimisé associé n’est pas extraordinaire, il comprend quelques manipulations de la pile :

pain():
  push rax
  mov rdi, rsp
  call empty::doit() const@PLT
  pop rax
  ret

Rien de trop surprenant si on y réfléchit à deux fois : le compilateur ne connaît rien de l’implémentation de empty::doit() qui peut très bien avoir pour effet de bord de stocker this dans une variable globale quelconque. Il faut donc laisser la possibilité à e d’avoir une adresse.

On peut très bien lui enlever cette possibilité en déclarant doit comme étant static. Mais dans ce cas-là, on pourra appeler cette méthode sans instance de l’objet, ce qui change le contrat avec l’utilisateur. Comment informer le compilateur que la méthode n’utilise pas l’adresse de l’objet ? Un ami m’a proposé cette élégante solution :

struct empty {
  void doit() const { really_doit(); }
  private:
  static void really_doit();
};
 
void pain() {
  empty e;
  e.doit();
}

Le code optimisé par Clang pour ce bout de code est d’une absolue simplicité :

pain():
    jmp empty::really_doit()@PLT

Le compilateur a supprimé l’appel de méthode pour directement invoquer la méthode statique, qui n’a par construction pas besoin de l’adresse de l’objet. Il devient inutile d’allouer l’objet sur la pile, et grâce au contrôle de la visibilité, l’interface publique de l’objet reste la même.

Cette optimisation peut paraître ridicule, mais elle permet de supprimer quelques manipulations de la pile, et épargne un store supplémentaire quand on active -ftrivial-auto-var-init=pattern, ce qui lui a valu d’atterrir dans Firefox avec https://phabricator.services.mozilla.com/D184083.



Article rédigé par

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

C++ : contrôlez votre espérance de vie

Magazine
Marque
MISC
Numéro
141
Mois de parution
septembre 2025
Spécialité(s)
Résumé

Le langage C est un magnifique outil pédagogique pour enseigner le concept de mémoire, puisqu’il laisse la main au développeur pour la gérer. Mais on le sait, cet attrait n’en est pas un quand on parle de sûreté d’exécution, puisque ce langage est connu pour ne pas aider le développeur pour détecter les usages illégaux liés à la mémoire. Le langage Rust a attaqué le problème en rendant explicite le concept de durée de vie. Le langage Safe C++ tente quant à lui d’introduire ce concept en C++. Il y a plus de vingt ans, splint proposait déjà un concept moins ambitieux pour C. Et maintenant certains fous essaient de le porter vers C++, à travers des extensions de Clang. Quelles sont donc toutes ces approches ?

Les listes de lecture

Python niveau débutant

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.

Au pays des algorithmes

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.

Analyse de données en Python

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.
Plus de listes de lecture