Est-ce que const-correct peut améliorer les performances?

J’ai lu de nombreuses fois que l’application de const-correct dans votre code C ou C ++ n’est pas seulement une bonne pratique en ce qui concerne la maintenabilité, mais elle peut également permettre à votre compilateur d’effectuer des optimisations. Cependant, j’ai également lu le contraire dans son intégralité: cela n’affecte pas du tout les performances.

Par conséquent, avez-vous des exemples où la correction correcte peut aider votre compilateur à améliorer les performances de votre programme?

const correction de const ne peut pas améliorer les performances car const_cast et mutable sont dans le langage et permettent au code de violer les règles de manière conforme. Cela devient encore pire en C ++ 11, où vos données const peuvent être par exemple un pointeur sur un std::atomic , ce qui signifie que le compilateur doit respecter les modifications apscopes par d’autres threads.

Cela dit, il est sortingvial que le compilateur examine le code qu’il génère et détermine s’il écrit réellement dans une variable donnée et applique les optimisations en conséquence.

Tout cela dit, la correction de const est une bonne chose en ce qui concerne la maintenabilité. Sinon, les clients de votre classe pourraient casser les membres internes de cette classe. Par exemple, considérons la norme std::ssortingng::c_str() – si elle ne pouvait pas renvoyer une valeur const, vous pourriez contourner le tampon interne de la chaîne!

N’utilisez pas const pour des raisons de performances. Utilisez-le pour des raisons de maintenabilité.

Oui il peut.

La plupart des const sont purement pour le bénéfice du programmeur et ne permettent pas au compilateur de s’optimiser car il est légal de les rejeter et ils ne disent donc rien au compilateur pour l’optimisation. Cependant, certains const ne peuvent pas être jetés (légalement) et ceux-ci fournissent au compilateur des informations utiles pour l’optimisation.

Par exemple, l’access à une variable globale définie avec un type const peut être intégré alors qu’un autre sans type const ne peut pas être intégré car il peut être modifié à 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 même si const peut améliorer les performances, dans la plupart des cas, cela ne se fera pas ou ne le sera pas, mais le changement ne sera pas perceptible. La principale utilité de const n’est pas l’optimisation.


Steve Jessop donne un autre exemple dans son commentaire sur la question initiale qui évoque quelque chose qui mérite d’être mentionné. Dans une scope de bloc, un compilateur peut déduire si une variable sera mutée et 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 si foo1 sera muté car il pourrait être modifié dans d’autres unités de traduction. Je suppose qu’un hyper-compilateur hypothétique pourrait parsingr un programme entier et déterminer s’il est valable d’ foo1 access en ligne à foo1 … mais les vrais compilateurs ne le peuvent pas.

dans mon expérience, non

Pour les variables scalaires, le compilateur est en mesure de déterminer à quel moment la valeur est modifiée et d’effectuer elle-même les optimisations nécessaires.

Pour les pointeurs de tableau, la correction de const ne garantit pas que les valeurs sont réellement constantes en présence de problèmes potentiels de crénelage. Le compilateur ne peut donc pas utiliser le modificateur const seul pour effectuer des optimisations

Si vous recherchez une optimisation, vous devriez considérer __ressortingct__ ou des modificateurs / atsortingbuts de fonctions spéciales: http://gcc.gnu.org/onlinedocs/gcc/Function-Atsortingbutes.html

Un peu vieux, mais s’applique toujours: http://www.gotw.ca/gotw/081.htm Et quelques autres: http://cpp-next.com/archive/2009/08/want-speed-pass-by -valeur/