Maison > développement back-end > 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 ?

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 ?

Patricia Arquette
Libérer: 2024-11-04 08:34:01
original
591 Les gens l'ont consulté

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 du manque d'exigence

La justification de ne pas exiger que les littéraux de chaîne soient regroupés dans la norme C est dû à 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 a plus de chances 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.

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