Wenn ich in C++ programmiere, werde ich oft cout
Anweisungen mit einem Newline (\n
) beenden. Mein Instinkt war jedoch immer, diesen Zeilenumbruch als Zeichenfolgenliteral auszudrücken: "\n"
, obwohl es ein einzelnes Zeichen ist und effizienter ausgedrückt werden kann ('\n'
). Zum Beispiel:Sind 1-Zeichen-String-Literale jemals für einfache Zeichenliterale optimiert?
cout << "The value of var is " << var << "\n";
Es gibt einen viele Code mit diesem Phänomen. So wird die Frage wie folgt:
Gibt es einen Unterschied whatsoever in der Effizienz der beiden unterschiedlichen Möglichkeiten, den Newline-Zeichen-Konstante zum Ausdruck? Ich mache mir keine Gedanken darüber, ob ich tatsächlich einen Unterschied in der Ausführung des produzierten Programms machen könnte (was ich für trivial halte). eher ärgert es mich, dass irgendeine Effizienz, wie klein sie auch sein mag, ohne Grund verloren gehen könnte.
Wenn die String-Literal-Version weniger effizient ist, wird der Compiler sie auf die Version mit konstanter Zeichenanzahl optimieren, da die beiden das gleiche Verhalten bieten?
Ich bin auch vertraut mit
std::endl
. Die Dokumentation besagt, dass "dieser Manipulator oft irrtümlicherweise verwendet wird, wenn eine einfache neue Zeile gewünscht wird, was zu einer schlechten Pufferungsleistung führt." Und zeigt auf this article für weitere Informationen. Dieser Artikel gibt jedoch an, dass die erwähnte "schlechte Leistung" nur für Datei-E/A gilt und dass die Verwendung vonendl
zum Schreiben auf den Bildschirm tatsächlich die Leistung verbessern kann. Was ist damit los?
Ich habe die C++ Standardbibliothek gesucht, konnte aber nicht die Implementierungen der relevanten Überlastungen des <<
Betreiber finden. Ich fand die Erklärungen in ostream.tcc
:
extern template ostream& operator<<(ostream&, char);
extern template ostream& operator<<(ostream&, const char*);
aber keine Hinweise darauf, wie die Mechanik bei der Umsetzung einkochen.
Dies ist eher eine theoretische Frage als alles, also bin ich nicht interessiert zu lesen "Es gibt keinen praktischen Unterschied zwischen den beiden." Ich weiß das. Ich frage mich nur, ob überhaupt ein Unterschied besteht und wie der Compiler damit umgeht.
Das einzige "one char string literal", das existiert, ist eine leere Zeichenfolge. Vergessen Sie niemals den Nullabschluss. –
'" \ n "' ist vom Typ 'const char [2]', wie kann das * auf ein einzelnes Zeichen * optimiert werden? Außerdem scheint Ihre Frage 3 unabhängig zu sein und sollte wahrscheinlich als separate Frage veröffentlicht werden. – Praetorian
das OP ist sich der Speicherdifferenz voll bewusst, Jungs. das ist im ersten Absatz abgedeckt. Das OP fragt, ob der c-String durch den Compiler für diesen speziellen Ein-Zeichen-Fall ersetzt werden kann. Das einzelne Zeichen benötigt keinen Terminator. – justin