Égalité des pointeurs de fonction et adresses distinctes
Question :
En C, sont des pointeurs de fonction pour des fonctions distinctes garanties d'avoir des adresses distinctes ? Plus précisément, pour le code suivant :
void foo() {} void bar() {} template<class T> void foo() { }
Est-ce que &foo != &bar et &foo
Réponse :
La norme n'exige pas explicitement que les pointeurs de fonction pour des fonctions distinctes aient des adresses distinctes. Cependant, cela permet aux implémentations d'optimiser des fonctions avec des définitions identiques, et cette optimisation peut entraîner des adresses de fonctions identiques.
En fait, Microsoft Visual C (MSVC) plie de manière agressive les fonctions avec des implémentations identiques, en leur attribuant la même adresse. . Ce comportement est considéré comme non conforme.
D'autre part, l'éditeur de liens Gold offre un paramètre plus sûr qui maintient des adresses distinctes pour les fonctions, même si elles ont des définitions identiques.
Détaillé Explication :
La norme C définit l'égalité pour les pointeurs de fonction comme suit :
Cette dernière condition donne une latitude aux implémentations pour alias différentes fonctions et ne nécessite pas explicitement des pointeurs vers différentes fonctions être inégal.
Cependant, prendre l'adresse d'une fonction est un comportement observable, et changer l'adresse peut violer la règle du "comme si". Cette règle exige que le comportement de l'implémentation soit impossible à distinguer du comportement spécifié dans la norme.
Par conséquent, bien que la norme n'interdise pas explicitement l'alias d'adresse de fonction, on peut affirmer qu'elle viole la règle « comme si ». , conduisant à une non-conformité comportement.
Observations :
Conclusion :
Bien que la norme autorise l'alias d'adresse de fonction, il est généralement recommandé d'éviter cette optimisation car elle peut créer des problèmes de portabilité et de fiabilité. .
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!