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; }
- APar élimination des sous-expressions communes, g appelle sq deux fois
- BPar repliement de constantes, g devient un code qui renvoie simplement 37
- 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.