J'ai lu à plusieurs reprises que l'application de const-correctness dans votre code C ou C ++ n'est pas seulement une bonne pratique en ce qui concerne la maintenabilité, mais cela peut également permettre à votre compilateur d'effectuer des optimisations. Cependant, j'ai également lu le contraire: cela n'affecte pas du tout les performances.
Par conséquent, avez-vous des exemples où la correction de const peut aider votre compilateur à améliorer les performances de votre programme?
c++
performance
const-correctness
shuhalo
la source
la source
const
performances ont fait une différence: stackoverflow.com/questions/1121791/… . Mais c'était essentiellement une question de qualité de mise en œuvre.const
n'a pas déterminé si le compilateur pouvait légalement effectuer l'optimisation, il s'est juste produit que la version du compilateur n'a pas réussi à le faire quand il manquait.Réponses:
const
l'exactitude ne peut pas améliorer les performances carconst_cast
etmutable
sont dans le langage, et permet au code d'enfreindre les règles de manière conforme. Cela devient encore pire en C ++ 11, où vosconst
données peuvent par exemple être un pointeur vers astd::atomic
, ce qui signifie que le compilateur doit respecter les modifications apportées par d'autres threads.Cela dit, il est trivial pour le compilateur de regarder le code qu'il génère et de déterminer s'il écrit réellement dans une variable donnée, et d'appliquer les optimisations en conséquence.
Cela dit, l'
const
exactitude est une bonne chose en ce qui concerne la maintenabilité. Sinon, les clients de votre classe pourraient briser les membres internes de cette classe. Par exemple, considérez le standardstd::string::c_str()
- s'il ne pouvait pas renvoyer une valeur const, vous seriez en mesure de visser avec le tampon interne de la chaîne!Ne l'utilisez pas
const
pour des raisons de performances. Utilisez-le pour des raisons de maintenabilité.la source
const
sont des panneaux indiquant, "vous faites quelque chose de stupide".Oui il peut.
La plupart des
const
s sont purement pour le bénéfice du programmeur et n'aident pas le compilateur à optimiser car il est légal de les rejeter et ainsi ils ne disent rien d'utile au compilateur pour l'optimisation. Cependant, certainsconst
s ne peuvent pas être jetés (légalement) et ceux-ci fournissent au compilateur des informations utiles pour l'optimisation.À titre d'exemple, l'accès à une variable globale définie avec un
const
type peut être inséré alors qu'une variable sansconst
type ne peut pas être insérée car elle peut changer au moment de l'exécution.https://godbolt.org/g/UEX4NB
C ++:
int foo1 = 1; const int foo2 = 2; int get_foo1() { return foo1; } int get_foo2() { return foo2; }
asm:
foo1: .long 1 foo2: .long 2 get_foo1(): push rbp mov rbp, rsp mov eax, DWORD PTR foo1[rip] ; foo1 must be accessed by address pop rbp ret get_foo2(): push rbp mov rbp, rsp mov eax, 2 ; foo2 has been replaced with an immediate 2 pop rbp ret
En termes pratiques, gardez à l'esprit que si cela
const
peut améliorer les performances, dans la plupart des cas, ce ne sera pas le cas ou ce sera le cas, mais le changement ne sera pas perceptible. La principale utilité deconst
n'est pas l'optimisation.Steve Jessop donne un autre exemple dans son commentaire sur la question initiale qui soulève quelque chose qui mérite d'être mentionné. Dans une portée de bloc, il est possible pour un compilateur de déduire si une variable sera mutée et d'optimiser en conséquence, indépendamment de
const
, car le compilateur peut voir toutes les utilisations de la variable. En revanche, dans l'exemple ci-dessus, il est impossible de prédire sifoo1
sera muté car il pourrait être modifié dans d'autres unités de traduction. Je suppose qu'un ultra-compilateur sensible hypothétique pourrait analyser un programme entier et déterminer s'il est valide pour un accès en ligne àfoo1
... mais les vrais compilateurs ne le peuvent pas.la source
d'après mon expérience, non
Pour les variables scalaires, le compilateur est capable de déterminer chaque fois que la valeur est modifiée et d'effectuer lui-même l'optimisation nécessaire.
Pour les pointeurs de tableau, l'exactitude de const ne garantit pas que les valeurs sont vraiment constantes en présence de problèmes potentiels d'alias. Par conséquent, le compilateur ne peut pas utiliser le modificateur const seul pour effectuer des optimisations
si vous recherchez une optimisation, vous devriez envisager
__restrict__
des modificateurs / attributs de fonction spéciaux: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.htmlla source
Un peu vieux, mais toujours valable: http://www.gotw.ca/gotw/081.htm Et encore plus: http://cpp-next.com/archive/2009/08/want-speed-pass-by -valeur/
la source