ProgrammationDéveloppeur C++ Embedded

Parlez-nous de la constance à l'heure de la liaison et à l'heure de la compilation en C++. Quelle est la différence entre constexpr et const ? Quand utiliser l'un ou l'autre ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En C++, il y a la constance à l'heure de la compilation et à l'heure de la liaison.

  • Une variable const est un objet qui ne peut pas être modifié après son initialisation. Mais const ne garantit pas toujours que la valeur est connue à l'heure de la compilation ; elle peut être calculée seulement à l'exécution.
  • constexpr garantit que l'expression ou la fonction sera évaluée à l'heure de la compilation.

Exemple :

const int x = time(0); // const, mais PAS constexpr : la valeur est calculée à l'exécution constexpr int y = 2 + 2; // constexpr : connus à l'heure de la compilation constexpr int square(int x) { return x * x; } int arr[square(3)]; // taille du tableau — expression à l'heure de la compilation

Utilisez constexpr pour les expressions constantes qui doivent être accessibles par le compilateur, par exemple, pour la taille des tableaux ou les paramètres de template.

Question piège.

Une fonction déclarée comme constexpr peut-elle être appelée avec des arguments non constants ?

Réponse : Oui ! Si les arguments sont connus à l'heure de la compilation, le résultat sera calculé à cette heure-là. Si les arguments ne sont connus qu'à l'exécution, la fonction sera calculée comme d'habitude.

constexpr int double_val(int x) { return x * 2; } int val = std::rand(); int result = double_val(val); // Appelé à l'heure d'exécution

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


Histoire

Un des modules définissait la taille d'un tableau via const int, pensant que c'était une constante à l'heure de la compilation. Sur un autre compilateur, cela a causé une erreur, car la valeur était calculée à l'heure d'exécution, et la taille du tableau ne correspondait pas à la norme.


Histoire

Dans le calcul des hachages, le compilateur ne pouvait pas optimiser les calculs, car une variable const était utilisée au lieu de constexpr. Résultat : diminution de performance de plus de 2 fois sur les nouvelles versions.


Histoire

Lors de la migration vers des normes modernes, des mots-clés ont été mélangés et une fonction a été déclarée comme const plutôt que constexpr, ce qui a empêché d'utiliser le résultat dans les expressions à l'heure de la compilation des templates. Un diagnostic rapide a montré l'erreur, mais lors de la révision, elle est allée dans le master.