Frage

Ich habe mehrere identische String-Konstanten in meinem Programm:

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

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

Gibt es garantieren, dass sie die gleiche Adresse sind, haben, das heißt konnte ich den folgenden Code schreiben? Ich habe gehört, dass GNU C ++ Strings optimiert, so dass sie die gleiche Adresse haben, könnte ich diese Funktion in meinen Programmen?

int main()
{
  const char* ok = "Ok";
  if ( ok == Ok() ) // is it ok?
  ;
}
War es hilfreich?

Lösung

Es gibt sicherlich keine Garantie, aber es ist eine gemeinsame (glaube ich) Optimierung.

Die C ++ Standard sagt (2.13.4 / 2 „Stringliterale):

  

Ob alle Stringliterale verschieden sind (dh, werden in nicht überlappenden Objekten gespeichert) ist die Implementierung definiert.

Um klar zu sein, sollten Sie nicht Code schreiben, der diese Optimierung stattfinden wird davon ausgegangen, -. Wie Chris Lutz sagt, C ++ Code, der auf diese verlässt sich Code, um gebrochen zu werden wartet

Andere Tipps

Dies heißt Zeichenfolge Internierung

Sie Fall ist es besser ist, nicht darauf zu verlassen. Die Bereiche sind unterschiedlich, aber ich finde mich nicht sehr kompetent zu diesem Thema

GCC verwendet solche Optimierung, und Microsoft hat (sie nennen es String-Pooling ). Es ist nur die Optimierung, C ++ Standard-ausdrücklich, dass Sie nicht, dass (in 2.13.4 / 2) verwenden können. Darüber hinaus stellen Sie sich vor, dass Sie Zeiger auf String von einem anderen Modul / Bibliothek bekommen. - Ich glaube nicht, Compiler eine solche Optimierung in diesem Fall machen könnte

  

Gibt es garantieren, dass sie die gleiche Adresse sind, haben, das heißt konnte ich den folgenden Code schreiben?

Der Standard erlaubt es, solche Optimierungen seit Stringliterale schreibgeschützt sind.

  

Ich habe gehört, dass GNU C-Strings ++ zu optimieren, so dass sie die gleiche Adresse haben, könnte ich diese Funktion in meinen Programmen verwenden?

Ja, GCC / G ++ oft tun. AFAIK, gibt es eine Option, dies zu aktivieren / deaktivieren.

Es gibt keine solche Garantie. Die Sprache sagt nur, dass sie können haben die gleiche Adresse. Oder sie vielleicht nicht.

Eigentlich gibt es eine Lösung, so einfache Lösung:

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;
}

Sie können nicht zwei verschiedene Stringliterale, zu vergleichen, sondern eine konstante globale Variable verwenden, um Ihre Bedeutung zu vermitteln und es OK die Speicheradresse vergleichen:)

Einige extern können fehlen, ... Ich habe einige Schwierigkeiten mit dem Tier bekam

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top