Oui, moderne compilateurs C peut éluder redondant appels de fonction si et seulement si elles peuvent prouver que cette optimisation se comporte comme si, à l'origine sémantique du programme ont été suivies. Par exemple, cela signifie que signifie qu'ils pourraient éliminer les multiples appels à la même fonction avec les mêmes arguments, si la fonction n'a pas d'effets secondaires et si sa valeur de retour ne dépend que de l'argumentation.
Maintenant, vous avez demandé spécifiquement const
- c'est surtout utile pour le développeur, et de ne pas le coder. Un const
fonction est une des astuces que la méthode ne modifie pas l'objet auquel il est appelé, et const
arguments sont des conseils que les arguments ne sont pas modifiés. Toutefois, la fonction peut (légalement1) a jeté l' const
-ness de l' this
de pointeur ou de ses arguments. Ainsi, le compilateur ne peut pas compter sur elle.
En outre, même si const
objets passés à une fonction vraiment n'ont jamais été modifiés à l'intérieur de cette fonction, et const
fonctions jamais modifié le récepteur de l'objet, la méthode peut facilement compter sur mutable données globales (et peut muter ces données). Considérons, par exemple, une fonction qui renvoie l'heure actuelle, ou qui incrémente un compteur global.
Si l' const
déclarations aider le programmeur, pas le compilateur2.
Cependant, le compilateur peut-être utiliser d'autres astuces pour prouver les appels sont redondants:
- La fonction peut être dans la même unité de compilation en tant qu'appelant, permettant au compilateur de l'inspecter et de déterminer exactement de quoi elle repose. La forme ultime de ce qui est l'in-lining: le corps de la fonction peut être déplacé en l'appelant à quel point l'optimiseur peut supprimer code redondant de plus tard appels (jusqu'à y compris tout le code à partir de ces appels entièrement et peut-être toutes ou le port de l'appel d'origine aussi).
- La suite d'outils peut utiliser un certain type de lien temps-optimisation, qui permet effectivement le type d'analyse décrit dans le point ci-dessus, même pour les fonctions et les appelants dans les différentes unités de compilation. Cela pourrait permettre cette optimisation pour tout le code présent lors de la finale de l'exécutable est généré.
- Le compilateur peut permettre à l'utilisateur d'annoter une fonction avec un attribut qui informe le compilateur que l'on peut considérer la fonction comme n'ayant pas d'effets secondaires. Par exemple, gcc fournit l'
pure
et const
fonction des attributs qui informe gcc
que les fonctions n'a pas d'effets secondaires, et ne dépendent que de leurs paramètres (et sur des variables globales, dans le cas d' pure
).
1 Généralement, tant que l'objet n'a pas été défini à l'origine comme const
.
2 Il est en un certain sens, const
définitions ne l'aide du compilateur: ils peuvent mettre des objets globaux définis comme const
en lecture seule section de l'exécutable (si une telle fonction existe) et également combiner ces objets lorsqu'ils sont égaux (par exemple, à l'identique des constantes de chaîne).