Compilateurs

Dans le code ci-dessus, quelle optimisation s'applique ensuite après l'expansion en ligne de sq, et avec quel résultat ?

static int sq(int v) { return v * v; }
int g(void) { return sq(6) + 1; }
  1. APar élimination des sous-expressions communes, g appelle sq deux fois
  2. BPar repliement de constantes, g devient un code qui renvoie simplement 37
  3. CPar déroulage de boucle, v * v est remplacé par six additions
Afficher la réponse et l'explication

Réponse : B. Par repliement de constantes, g devient un code qui renvoie simplement 37

Après expansion en ligne de sq, g contient return 6 * 6 + 1; et tous les opérandes de la multiplication sont des constantes. Le repliement de constantes calcule ensuite 6 * 6 = 36 puis 36 + 1 = 37, et g devient un code qui renvoie simplement 37. L'expansion en ligne ne se contente pas de supprimer le coût d'appel : elle rend possibles de telles optimisations exploitant les valeurs de l'appelant, ce qui est un avantage majeur. Il n'y a pas de boucle ici, et sq n'est pas appelée deux fois.

S'entraîner sur ce thème Retour au thème

Autres questions sur Compilateurs

  1. Quelle définition du pipeline logiciel (software pipelining) est correcte ?
  2. Pourquoi un compilateur, sous réglage strict, ne réordonne-t-il pas de lui-même l'addition en virgule flottante (a + b) + c en a + (b + c) ?
  3. Quel type d'instructions la vectorisation automatique du compilateur utilise-t-elle ?
  4. Quelle condition fondamentale les optimisations du compilateur doivent-elles respecter ?
  5. Quelle définition de la sélection d'instructions, l'une des étapes de la génération de code, est correcte ?

Comparatifs sur ce thème