Pregunta

Tengo varias constantes de cadena idénticas en mi programa:

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

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

¿Hay garantía de que tengan la misma dirección, es decir, podría escribir el siguiente código? Escuché que GNU C ++ optimiza las cadenas para que tengan la misma dirección, ¿puedo usar esa función en mis programas?

int main()
{
  const char* ok = "Ok";
  if ( ok == Ok() ) // is it ok?
  ;
}
¿Fue útil?

Solución

Ciertamente no hay garantía, pero es una optimización común (creo).

El estándar de C ++ dice (2.13.4 / 2 " literales de cadena):

  

Si todos los literales de cadena son distintos (es decir, se almacenan en objetos que no se superponen) está definido por la implementación.

Para que quede claro, no debe escribir código que asuma que esta optimización se llevará a cabo, como dice Chris Lutz, el código C ++ que se basa en esto es un código que está a punto de romperse.

Otros consejos

esto se llama interning de cadena

En tu caso, es mejor no confiar en eso. Los ámbitos son diferentes, pero no me encuentro muy competente en este tema

GCC usa dicha optimización, y Microsoft sí (lo llaman agrupación de cadenas ). Es solo optimización, C ++ Standard explícitamente declara que no se puede usar eso (en 2.13.4 / 2). Además, imagina que obtendrás el puntero a la cadena de algún otro módulo / biblioteca. No creo que el compilador pueda hacer tal optimización en ese caso.

  

¿Hay garantía de que tengan la misma dirección, es decir, podría escribir el siguiente código?

El estándar permite tales optimizaciones, ya que los literales de cadena son de solo lectura.

  

Escuché que GNU C ++ optimiza las cadenas para que tengan la misma dirección, ¿podría usar esa función en mis programas?

Sí, GCC / G ++ a menudo hace eso. AFAIK, hay una opción para activarlo / desactivarlo.

No hay tal garantía. El idioma simplemente dice que podrían tener la misma dirección. O tal vez no.

En realidad, hay una solución, una solución tan 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;
}

No puede comparar dos literales de cadena diferentes, pero use una variable global constante para transmitir su significado y es OK para comparar la dirección de la memoria :)

Puede que falte algo de externo ... Tengo algún problema con esa bestia

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top