Maison > développement back-end > C++ > Les fonctions C distinctes ont-elles toujours des adresses de pointeur de fonction distinctes ?

Les fonctions C distinctes ont-elles toujours des adresses de pointeur de fonction distinctes ?

Mary-Kate Olsen
Libérer: 2024-12-01 22:39:19
original
576 Les gens l'ont consulté

Do Distinct C   Functions Always Have Distinct Function Pointer Addresses?

É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() { }
Copier après la connexion

Est-ce que &foo != &bar et &foo != &foo est-il garanti que c'est vrai ?

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 :

  • Deux pointeurs de fonction sont comparables s'ils pointent vers la même fonction.
  • Alternativement, si les deux pointeurs de fonction représentent la même adresse, ils sont également considéré comme égal.

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 :

  • La modification des adresses de fonction peut perturber les programmes qui reposent sur des adresses de fonction uniques, tels que ceux utilisant des pointeurs de fonction comme valeurs uniques.
  • Certains éditeurs de liens, notamment Gold et le lld de LLVM, effectuent des optimisations qui évitent les alias d'adresse problématiques uniquement lorsque nécessaire.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal