"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > L’adresse mémoire d’un littéral de chaîne est-elle cohérente entre les unités de traduction en C et C++ ?

L’adresse mémoire d’un littéral de chaîne est-elle cohérente entre les unités de traduction en C et C++ ?

Publié le 2024-11-13
Parcourir:499

Is the Memory Address of a String Literal Consistent Across Translation Units in C and C  ?

Adresse littérale de chaîne dans les unités de traduction

En C et C , les programmeurs utilisent souvent des littéraux de chaîne à diverses fins. Une question courante se pose : est-il fiable de supposer que la même chaîne littérale dans différentes unités de traduction aura la même adresse mémoire ?

Norme C/C

Le C99 et les projets de normes C laissent spécifiquement ce sujet non spécifié. La section 6.4.5 du projet de norme C99 stipule qu'« il n'est pas précisé si ces tableaux [littéraux de chaîne] sont distincts à condition que leurs éléments aient les valeurs appropriées ». Cela signifie que le compilateur est libre de décider de regrouper ou non les littéraux de chaîne.

Implémentations du compilateur

En pratique, différents compilateurs ont des comportements différents concernant le regroupement de littéraux de chaîne.

  • GCC : Prend en charge le regroupement de littéraux de chaîne entre les unités de compilation avec l'indicateur -fmerge-constants. Ce comportement peut être désactivé avec -fno-merge-constants.
  • Visual Studio : Inclut une option (/GF) pour le regroupement de littéraux de chaîne.
  • Autre compilateurs : Peut ou non prendre en charge le regroupement de littéraux de chaîne, et il est spécifique à l'implémentation.

Raison d'être de Absence d'exigence

La raison pour ne pas exiger que les littéraux de chaîne soient regroupés dans la norme C est due à la diversité des compilateurs et des environnements d'exécution à l'époque. Certaines implémentations stockaient les chaînes littérales dans la ROM, tandis que d'autres les stockaient dans des sections de données inscriptibles. Pour garantir la portabilité, il a été jugé préférable de n'imposer aucun comportement spécifique.

Considérations pratiques

En général, il n'est pas portable de s'appuyer sur des chaînes littérales ayant le même adresse mémoire à travers les unités de traduction. Cependant, au sein d'une même unité de traduction, le comportement est plus susceptible d'être cohérent, car le compilateur a plus de contrôle sur les optimisations.

Conclusion

L'adresse mémoire d'un le littéral de chaîne est un détail d’implémentation et on ne peut pas compter sur sa cohérence entre les unités de traduction. Il est important d'être conscient de ce fait et d'écrire du code indépendant de ces détails d'implémentation.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3