Ich habe keinen spezifischen Kontext, in dem ich die Frage stelle, aber als ich ein Einsteigerbuch über C ++ las, bemerkte ich, dass sowohl ein Endl-Stream-Manipulator als auch ein Newline-Escape-Zeichen beim Umgang mit einem Stream-Objekt verwendet wurden.
Das Beispiel lautet wie folgt:
cout << "Hello World" << endl;
cout << "Hello World\n";
Meine Fragen sind:
- Ist es angemessener, den Stream-Manipulator (endl) in einer bestimmten Situation und ein Escape-Zeichen in einer anderen Situation zu verwenden?
- Gibt es in Bezug auf die Effizienz Nachteile bei der Verwendung einer der beiden Methoden?
- Sind sie vollständig austauschbar?
- Ich habe gelesen, dass eine Escape-Sequenz als einzelnes Zeichen gespeichert ist. Bedeutet das, dass es sinnvoller ist, endl zu verwenden, wenn Sie nur wenig Speicher benötigen?
- Verbraucht der Stream-Manipulator in irgendeiner Weise Speicher, wenn ja, mehr als die Escape-Sequenz?
Danke, StackExchange Entschuldigung, wenn ich dies im falschen Abschnitt gepostet habe, dachte ich, dass es als Datenstruktur gezählt wird.
c++
data-structures
Nathan Taylor
quelle
quelle
Antworten:
o << std::endl
entspricht dem folgenden Code:Mit anderen Worten, sollten Sie nur verwenden,
std::endl
wenn Sie den Stream leeren müssen. Beispielsweise:Wenn Sie nicht brauchen , um den Strom zu spülen, dann verwenden Sie
\n
stattstd::endl
. Die zusätzlichen Anrufeflush
können die Leistung beeinträchtigen (manchmal erheblich).Weitere Informationen finden Sie unter cppreference.com .
In Bezug auf der Speichernutzung: Sorgen über
\n
Vergleich mitstd::endl
ziemlicher Sicherheit ist eine unnötige Mikro-Optimierung, aber im Allgemeinen, würde ich erwarten , dass\n
weniger Speicher zu nehmen.\n
ist nur noch ein Byte am Ende eines String-Literales, während das Schreibenstd::endl
vom Compiler in (wahrscheinlich inline) Funktionsaufrufe vonput
und übersetzt wirdflush
.Plattformspezifische Unterschiede bei den Zeilenenden (Windows
\r\n
gegenüber Linux und OS X\n
) werden auf einer niedrigeren Ebene behandelt alsstd::endl
und\n
:\n
automatisch in das entsprechende plattformspezifische Zeilenende übersetzt. Wenn Sie ein plattformspezifisches Zeilenende lesen, wird es vom Stream automatisch in übersetzt\n
.std::cout
undstd::cin
insbesondere sind sie behandelt , als ob sie Textmodus.quelle
1) Verwenden Sie für die PortabilitätBearbeiten: Gemäß Kommentaren werden leitungssystemspezifische Endungen auf einer niedrigeren Ebene behandelt.endl
. Windows Newlines sind\r\n
Linux\n
und Mac\r
.2)
endl
spült den Stream,"\n"
nicht.3) Abhängig von der Portabilität.Sie können die Speichernutzung minimieren, indem Sie so oft wie möglich auf einen anderen Speicher zugreifen
endl
. Dies verringert jedoch die Leistung.Bearbeiten: Beseitigen Sie einige Fehler.
quelle
\n
auf jedem modernen Rechner lauffähig.endl
und\n
in Bezug auf plattformspezifische Leitungsenden gleichwertig sind; Plattformunterschiede werden auf einer niedrigeren Ebene behandelt.End of line sequence
(vorausgesetzt, der Textmodus ist aktiviert). DasEnd of line sequence
ist konvertiert zurück zu ‚\ n ' , wenn sie aus einer Datei lesen. Punkt 3) ist zweifelhaft. Und der letzte Absatz ist wieder falsch: Durch das Leeren sparen Sie keinen Platz, und durch das Leeren mehr als erforderlich wird Ihr Code verlangsamt (der Zweck des Puffers besteht darin, die Schreibeffizienz auf einem langsamen Gerät zu verbessern).