Égalité du pointeur de fonction et fusion des fonctions
Question :
Des fonctions distinctes peuvent-elles avoir la même adresse? Par exemple, &foo et &bar sont-ils garantis inégaux, et &foo
Réponse :
La norme C permet aux implémentations d'optimiser des fonctions avec des définitions identiques et de les fusionner en une seule fonction. Cela signifie que les adresses de deux de ces fonctions peuvent ne pas être distinctes.
Conformité aux normes :
Le rapport de défauts 1400 sur l'égalité des pointeurs de fonction reconnaît cette optimisation mais suggère que ce n'est pas le cas. clairement si la norme doit le traiter explicitement. La réponse du comité indique que les implémentations sont libres d'être optimisées dans les contraintes de la règle "comme si".
Règle "comme si" :
Sous Selon la règle du "comme si", une implémentation peut émuler un comportement observable sans adhérer à des détails spécifiques d'implémentation. Puisqu'il n'est pas explicitement exigé que les adresses des fonctions soient distinctes, cette optimisation ne viole pas la règle.
Opérateurs d'égalité :
Selon la section 5.10 de la norme, deux les pointeurs sont égaux s’ils sont tous deux nuls, pointent vers la même fonction ou représentent la même adresse. Cela permet aux implémentations d'attribuer la même adresse à deux fonctions si elles ont des définitions identiques.
Observations :
Keith Thompson note que l'impression du résultat de &foo == &bar est comportement observable. Changer le comportement observable en fusionnant des fonctions pourrait potentiellement interrompre ces programmes.
De plus, les macros comme SIG_DFL et SIG_ERR dans
Optimisation inter-procédurale :
Jan Hubička, un développeur GCC, confirme que le fait de plier des fonctions identiques au la même adresse est un comportement non conforme. Il casse certaines parties du code des en-têtes précompilés de GCC qui reposent sur des comparaisons d'adresses.
Conclusion :
Bien que la norme n'interdise pas explicitement l'optimisation de la fusion de fonctions identiques, elle Il est important de considérer l'impact potentiel sur le code qui repose sur la distinction des adresses de fonction. Les implémentations doivent aborder cette optimisation avec prudence et l'éviter dans les cas où un comportement observable serait affecté.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!