9
votes

Existe-t-il des avantages à déclarer un const plutôt qu'à une variable dans une fonction?

Si j'ai une fonction qui n'existe que pendant une courte durée, rend la liste des couleurs une constante faire une différence? XXX

Remarque: la liste réelle des couleurs contient des centaines de couleurs non seulement le petit échantillon que j'ai montré, pas sûr si cela fait une différence non plus.


5 commentaires

Appelez-vous cette fonction souvent?


@Tommy: La chaîne est copiée à son retour, car elle est de retour de valeur.


@Cameron: whoops, pour une raison quelconque, je pensais qu'il retournait un pointeur.


@Cameron Il est difficile de dire que cela pourrait être appelé beaucoup de fois, cela pourrait être appelé aucun, cela dépend de ce que fait l'utilisateur.


duplicaté possible de Const-Constance donne au compilateur plus de place Pour l'optimisation?


6 Réponses :


2
votes

Si vous parlez de performances, alors: non , il ne devrait pas faire de différence.


0 commentaires

20
votes

Cela vous empêche d'écraser accidentellement des variables que vous ne vouliez pas changer. "Oups!" - La protection est probablement const la fonction la plus importante de la const.

hypothétiquement un compilateur pourrait diviser une sorte d'optimisation de la connaissance d'une variable n'est pas censé changer, mais mes tests n'ont jamais trouvé un qui fait quelque chose de significatif dans la situation que vous décrivez.

const statique Est-ce que a une différence importante dans votre échantillon de code particulier. Parce que votre tableau de couleurs [] est local, il doit être construit à nouveau chaque fois que la fonction getRandColor () est appelée. Cela signifie que le constructeur de chaîne est exécuté cinq fois à chaque appel que vous appelez getRandColor () , qui est très gaspillé. Const statique signifie que les données sont construites une seule fois - la première fois que la fonction est exécutée - et mettre dans un espace mémoire partagé.


4 commentaires

statique est susceptible d'avoir plus d'impact que const ici de +1 pour le mentionner.


"Il doit être construit à nouveau" Je ne suis pas sûr que cela soit vrai. C'est probablement sera, mais je ne pense pas que "ça doit être" est précis.


C'est vraiment intéressant, cependant, que se passerait-il si j'avais la fonction A avec une variable X et la fonction B avec une autre variable appelée x et ils étaient tous deux du même type mais étaient censés être différents, ils hériteraient-ils d'hériter des données de l'autre?


@ @ N ° de variables locales statiques à l'intérieur d'une fonction ne sont visibles que dans cette fonction. Ils sont "localement scopés". Vous pouvez en apprendre davantage sur les variables locales statiques ici: MSDN .microsoft.com / fr-US / US / Bibliothèque / S1SB61XD (v = vsb61xd (v = vs.100) .aspx et les implications de les renvoyer des fonctions ici: Stackoverflow.com/questions/959951/...



2
votes

En déclarant une variable locale A Const, vous obtenez les avantages suivants:

  • Correcless: le compilateur s'assurera que vous ne modifiez pas accidentellement la valeur de la variable.
  • Clarté: vous documentez clairement que la variable est une constante.

    (Au fait, je ne suis pas sûr de ce qui est constant dans cet exemple spécifique. Plus bientôt ...)


3 commentaires

Les cordes sont constantes. Couleurs est un tableau Lvalue de 5 chaînes constantes .


Je viens de vérifier ça :)


Rien, comme vous ne pouvez pas attribuer à un tableau. C'est ce qui se passe quand on arrête d'utiliser une langue quotidienne - je continue à oublier les bases.



7
votes

en termes de performance? Non, probablement pas. Il semble que votre tableau puisse être statique aussi, puis peut-être oui .

en termes de style de code? Peut-être. Bien que l'ajout de const rend votre code un peu verbeux, il précise également que les données ne doivent pas être modifiées. Ceci est à la fois documenter et coffre-fort .


Idéalement, tous les objets de C ++ seraient des constantes par défaut, et vous devez écrire mutable pour les faire variables. Tout est en arrière!


4 commentaires

"Idéalement, toutes les variables en C ++ seraient const par défaut" - pensons à cela pour un peu :-)


@paxdiablo: objets. "Idéalement, toutes les variables en C ++ seraient Const par défaut." Tais-toi. :)


Idéalement, les "variables" seraient appelées "objets nommés" ;-)


"Idéalement, tous les noms feraient référence à des objets Constrouillis par défaut et nécessitent d'utiliser un mot-clé pour indiquer les références mutables"



2
votes

Parler des performances, mais aussi la lisibilité du code, vous devez créer la variable "couleurs" en dehors de la fonction (car une matrice de centaines est une quantité énorme de code, masquant la logique de la fonction) soit dans une fonction d'initialisation. , ou au niveau mondial. Si vous ne considérez pas d'extraire cette variable, du moins, faites-la statique.

Si ce tableau est utilisé uniquement pendant une courte période pendant l'exécution du programme, vous pouvez envisager de le remplir avant le premier appel à GetColors et, éventuellement, libérez-le lorsque vous n'en avez plus besoin.


0 commentaires

1
votes

Exemple légèrement différent: xxx

Le compilateur ne peut pas optimiser la dernière ligne pour utiliser la valeur 1 , car pour tout ce qu'il sait, bar () prend la valeur de global_ptr , le convertit sur int * et modifie x à travers elle. Ce serait un codage un peu risqué, mais je domine un qualificatif de const et la mutation est valide à condition que l'on référent soit réellement mutable, le compilateur doit donc le permettre.

mais, si x ont été marqués const alors ce serait invalide pour bar () pour jeter la const et la mutate, et l'optimiseur est donc libre de supposer que x maintient toujours la valeur 1 quand il est imprimé.

optimiseurs identifie certainement les constantes de temps de compilation pour ce type d'optimisation, donc je ne voudrais donc pas t être surpris de voir qu'il différence de code émis. Combien de différence cela rend la performance, je ne sais pas. Il n'est pas difficile de générer des cas où l'identification d'une constante peut par exemple remplacer une division (coûteuse) avec une twiddling (moins chère) de bit, ou peut autoriser des expressions impliquant x et un tas d'autres constantes à calculer à compiler l'heure au lieu d'exécution.

En outre, l'optimisation du temps de liaison peut permettre une inminciation d'être inlinée, auquel cas l'optimiseur de liaison peut inspecter son contenu de plus près et pourrait être capable d'exclure sa modification x même dans le cas non-consons.

Dans votre exemple, aucune référence à couleurs peut échapper à Code inconnu, la différence ne survient pas. Quoi qu'il en soit, une chaîne const est probablement plus difficile à optimiser avec qu'un const int. Il y a donc moins de chances que vous activez une optimisation brillante en utilisant const .


0 commentaires