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? 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. p> p>
6 Réponses :
Si vous parlez de performances, alors: non fort>, il ne devrait pas faire de différence. P>
Cela vous empêche d'écraser accidentellement des variables que vous ne vouliez pas changer. "Oups!" - La protection est probablement 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. P>
const statique fort> Est-ce que em> 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 const code> la fonction la plus importante de la const. P>
getRandColor () code> est appelée. Cela signifie que le constructeur de chaîne est exécuté cinq fois à chaque appel que vous appelez
getRandColor () code>, qui est très gaspillé. Const statique forte> 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é. p>
statique code> est susceptible d'avoir plus d'impact que
const code> ici de +1 pour le mentionner.
"Il doit être construit à nouveau" Je ne suis pas sûr que cela soit vrai. C'est probablement i> 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/...
En déclarant une variable locale A Const, vous obtenez les avantages suivants: P>
(Au fait, je ne suis pas sûr de ce qui est constant dans cet exemple spécifique. Plus bientôt ...) P>
Les cordes sont constantes. Couleurs Code> est un tableau
Lvalue de 5 chaînes constantes code>.
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.
en termes de performance? Non, probablement pas. Il semble que votre tableau puisse être en termes de style de code? Peut-être. Bien que l'ajout de Idéalement, tous les objets de C ++ seraient des constantes par défaut, et vous devez écrire statique code> aussi, puis peut-être oui em>. P>
const code> 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 em> et coffre-fort em>. P>
mutable code> pour les faire variables. Tout est en arrière! P>
"Idéalement, toutes les variables b> en C ++ seraient const b> par défaut" - pensons à cela pour un peu :-)
@paxdiablo: objets. "Idéalement, toutes les variables en C ++ seraient i> 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"
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. P>
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. p>
Exemple légèrement différent: Le compilateur ne peut pas optimiser la dernière ligne pour utiliser la valeur mais, si 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 En outre, l'optimisation du temps de liaison peut permettre une inminciation code> 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 Dans votre exemple, aucune référence à 1 code>, car pour tout ce qu'il sait,
bar () code> prend la valeur de
global_ptr code>, le convertit sur
int * code> et modifie
x code> à 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. P>
x code > ont été marqués
const code> alors ce serait invalide em> pour
bar () code> pour jeter la const et la mutate, et l'optimiseur est donc libre de supposer que
x code> maintient toujours la valeur
1 code> quand il est imprimé. p>
x code> et un tas d'autres constantes à calculer à compiler l'heure au lieu d'exécution. p>
x code> même dans le cas non-consons. p>
couleurs code> 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 code>. P> p>
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?