Question

J'ai plusieurs constantes de chaîne identiques dans mon programme:

const char* Ok()
{
  return "Ok";  
}

int main()
{
  const char* ok = "Ok";
}

Est-il garanti qu’ils ont la même adresse, c’est-à-dire, puis-je écrire le code suivant? J'ai entendu dire que GNU C ++ optimisait les chaînes pour qu'elles aient la même adresse. Puis-je utiliser cette fonctionnalité dans mes programmes?

int main()
{
  const char* ok = "Ok";
  if ( ok == Ok() ) // is it ok?
  ;
}
Était-ce utile?

La solution

Il n’ya certainement aucune garantie, mais c’est une optimisation courante (je pense).

La norme C ++ dit (2.13.4 / 2 "Littéraux de chaîne):

  

Que tous les littéraux de chaîne soient distincts (c'est-à-dire qu'ils sont stockés dans des objets ne se chevauchant pas) est défini par l'implémentation.

Pour être clair, vous ne devriez pas écrire de code qui suppose que cette optimisation aura lieu - comme le dit Chris Lutz, le code C ++ qui repose sur ce code est en attente d'être cassé.

Autres conseils

cela s'appelle interner une chaîne

Dans votre cas, il vaut mieux ne pas compter sur cela. Les champs d’application sont différents, mais je ne me trouve pas très compétent à ce sujet

GCC utilise cette optimisation, et Microsoft l’appelle (ils l’appellent pooling de chaînes ). Il ne s’agit que d’optimisation, C ++ Standard stipule explicitement que vous ne pouvez pas l’utiliser (dans 2.13.4 / 2). En outre, imaginez que vous obteniez le pointeur sur la chaîne d’un autre module / bibliothèque - je ne pense pas que le compilateur puisse faire une telle optimisation dans ce cas.

  

Est-il garanti qu’ils ont la même adresse, c’est-à-dire, puis-je écrire le code suivant?

La norme autorise de telles optimisations car les littéraux de chaîne sont en lecture seule.

  

J'ai entendu dire que GNU C ++ optimisait les chaînes pour qu'elles aient la même adresse. Puis-je utiliser cette fonctionnalité dans mes programmes?

Oui, GCC / G ++ le fait souvent. Autant que je sache, il existe une option pour activer / désactiver cette option.

Il n'y a pas de telle garantie. Le langage dit simplement qu’ils pourraient avoir la même adresse. Ou ils pourraient ne pas.

En fait, il existe une solution simple:

char const * const Message_Ok = "OK";

char const * const OK() { return Message_Ok; }

int main(int argc, const char* argv[])
{
  if (OK() == Message_Ok) { std::cout << "OK" << std::endl; }
  return 0;
}

Vous ne pouvez pas comparer deux littéraux de chaîne différents, mais utilisez une variable globale const pour transmettre votre signification. OK pour comparer l'adresse mémoire:)

Certains externes peuvent être manquants ... J'ai quelques difficultés avec cette bête

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top