Unterschied zwischen std::endl und (hinsichtlich der Plattformbekanntheit)
Frage
Bevor Sie diese Frage als Duplikat von deklarieren Das oder Das, Bitte beachten Sie, dass ich ein Problem an gesendet habe Der Online-Richter mit \n
und bekam WA, und dann mit std::endl
und bekam Klimaanlage.Ich brauche also eine ganz konkrete Antwort auf den Punkt Plattformbewusstsein:Ist \n
wirklich plattformbewusst, und schreibt die Laufzeitumgebung wirklich das richtige Zeilenende entsprechend der Plattform, wie die Antworten auf die anderen Fragen behaupten?Wenn ja, könnten Sie mir bitte sagen, wie das passiert ist?
Wenn die Antwort durch ein Zitat aus dem Standard zum Problem der Plattformbekanntheit gestützt werden kann, wäre ich wirklich dankbar.Ich habe die Antworten aller anderen Fragen gelesen (auch der geschlossenen), also wiederholen Sie bitte nicht die Sache mit dem „Leeren des Puffers“.
Lösung
Aus C++11
, §27.7.3.8
-
namespace std
{
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
}
Auswirkungen: Ruft os.put(os.widen(’ ’)) und dann os.flush() auf.
Gibt zurück:os.
Aus dem Standard geht also klar hervor endl
leert den Ausgabestream-Puffer, while \n
nicht.Im Allgemeinen möchten Sie verwenden endl
zum Drucken einer neuen Zeile, aber Sie sollten auch bedenken, dass jedes Mal, wenn Sie dies tun, auch der Ausgabepuffer geleert wird.
Über die Plattformbekanntheit
Aus dem Standard geht hervor, dass beide genau das Gleiche tun – eine neue Zeile auf genau die gleiche Weise drucken.Wenn also einer plattformunabhängig ist, sollte der andere auch derselbe sein.Da ich es genau weiß endl
ist plattformunabhängig, das sollte auch der Fall sein \n
.
Andere Tipps
std::endl
ist ein Manipulator, der ausgibt '\n'
, spült dann den Stream.Für den gelegentlichen Gebrauch sollten Sie es verwenden.Bei der Ausgabe großer Datenmengen kann es jedoch zu erheblichen Leistungseinbußen kommen. Verwenden Sie in diesem Fall '\n'
.
BEARBEITEN:
In Bezug auf die Plattformbekanntheit:beide geben genau das Gleiche aus.Wenn der Stream im Textmodus geöffnet wurde, wird der '\n'
bewirkt, dass eine plattformabhängige Darstellung eines Zeilenendes erfolgt:0x0A unter Unix, 0x0D, 0x0A unter Windows, starten Sie einen neuen Datensatz unter einigen Mainframes usw.Wenn der Stream im Binärmodus geöffnet wurde, wird ein einzelnes Byte (normalerweise 0x0A, aber es hängt tatsächlich von der verwendeten grundlegenden Zeichenkodierung ab) ausgegeben.