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

Les fonctions C distinctes ont-elles toujours des adresses distinctes ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-02 05:41:10382parcourir

Do Distinct C   Functions Always Have Distinct Addresses?

Les fonctions distinctes ont-elles des adresses distinctes ?

En C , on suppose généralement que les fonctions avec des implémentations différentes ont des adresses distinctes. Cependant, cela peut ne pas toujours être vrai dans certains scénarios.

Optimisation du repliement des fonctions

Les compilateurs d'optimisation peuvent utiliser le repliement des fonctions pour fusionner des fonctions avec des implémentations identiques en une seule entité. Cela peut amener les fonctions à partager la même adresse.

Bien que la norme C autorise les implémentations à effectuer de telles optimisations, il reste difficile de savoir s'il est explicitement autorisé aux fonctions de partager la même adresse.

Règle as-if et comportement observable

En vertu de la règle as-if, les compilateurs peuvent optimiser le code si le comportement observable reste inchangé. Prendre l'adresse d'une fonction est considéré comme un comportement observable.

Interprétation standard

Le rapport de défauts 1400 aborde ce problème de manière quelque peu vague. Il reconnaît que les implémentations peuvent alias des fonctions mais laisse l'interprétation exacte de la norme ouverte au débat.

Observations

On craint que le repliement de fonctions ne casse les programmes qui s'appuient sur adresses distinctes pour les fonctions. Par exemple, utiliser des adresses de fonction comme identifiants uniques pourrait être problématique si elles sont partagées par plusieurs fonctions.

Exigences C11

La norme C11 nécessite des macros telles que SIG_DFL et SIG_ERR. pour générer des valeurs distinctes qui se comparent à n’importe quelle fonction déclarable. Cela suggère que la norme C interdit aux fonctions d'avoir la même adresse.

Développements récents

Un développeur de gcc a précisé que le repliement agressif des fonctions de MSVC viole la norme. De plus, les discussions de llvm-dev soulignent que les éditeurs de liens plus intelligents évitent de combiner des fonctions à moins que l'un d'entre eux ne soit utilisé uniquement pour les appels et non pour l'observation d'adresses.

Conclusion

Basée sur les informations disponibles , on ne sait toujours pas si la norme C actuelle interdit ou autorise explicitement les optimisations de repliement de fonctions qui aboutissent à des fonctions identiques partageant la même adresse. La règle du "comme si" donne aux compilateurs la liberté d'optimiser, mais le comportement observable (prise d'adresses de fonction) ne devrait pas être affecté. Cependant, la prudence est de mise, car le repliement de fonctions peut potentiellement casser du code qui repose sur des adresses de fonction distinctes.

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!

Déclaration:
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