Ich habe mich daran erinnert, dass ich darüber im Standard gelesen habe, also los geht's:
Siehe C11-Standard, der definiert, wie sich die Standard-Streams verhalten. Da C++-Programme eine Schnittstelle zum CRT haben, sollte der C11-Standard hier die Spülpolitik bestimmen.
ISO/IEC 9899:201x
7.21.3 §7
Beim Programmstart sind drei Textströme vordefiniert und müssen nicht explizit geöffnet werden - Standardeingabe (zum Lesen konventioneller Eingaben), Standardausgabe (zum Schreiben konventionelle Ausgabe) und Standardfehler (zum Schreiben von Diagnoseausgaben). Als anfänglicher geöffnet ist, ist der Standardfehlerstrom nicht vollständig gepuffert; der Standardeingabe- und der Standard Ausgabestreams sind nur dann vollständig gepuffert, wenn festgestellt werden kann, dass sich der Stream nicht auf ein auf ein interaktives Gerät verweist.
7.21.3 §3
Wenn ein Stream ungepuffert ist, sollen die Zeichen von der Quelle oder am Ziel so schnell wie möglich erscheinen. Andernfalls werden die Zeichen möglicherweise akkumuliert und und als Block zur oder von der Host-Umgebung übertragen werden. Wenn ein Datenstrom vollständig gepuffert ist, sollen die Zeichen als Block an die Host-Umgebung übertragen werden, wenn ein Puffer ein Puffer gefüllt ist. Wenn ein Datenstrom zeilengepuffert ist, sollen die Zeichen Zeichen als Block an die oder von der Host-Umgebung übertragen werden, wenn ein Zeilenwechselzeichen angetroffen wird. Außerdem sollen die Zeichen als Block an die Host-Umgebung übertragen werden Umgebung als Block übertragen werden, wenn ein Puffer gefüllt ist, wenn eine Eingabe auf einem ungepufferten Stream angefordert wird oder wenn eine Eingabe in einem zeilengepufferten Datenstrom angefordert wird, der die Übertragung von Zeichen aus der Host-Umgebung erfordert. Die Unterstützung für diese Merkmale ist implementierungsabhängig und kann über die Funktionen setbuf und setvbuf beeinflusst werden.
Dies bedeutet, dass std::cout
y std::cin
sind vollständig gepuffert wenn und nur wenn sie beziehen sich auf ein nicht interaktives Gerät. Mit anderen Worten: Wenn stdout an ein Terminal angeschlossen ist, gibt es keinen Unterschied im Verhalten.
Wenn jedoch std::cout.sync_with_stdio(false)
aufgerufen wird, dann '\n'
führt auch bei interaktiven Geräten nicht zu einer Spülung. Andernfalls '\n'
ist gleichbedeutend mit std::endl
es sei denn, sie werden in Dateien gespeichert: c++ ref auf std::endl .
15 Stimmen
Gute Erklärung: cppkid.wordpress.com/2008/08/27/warum-ich-das-stdendl-vorziehe
32 Stimmen
@derobert dieser ist älter als der andere
8 Stimmen
@HediNaily in der Tat ist es. Aber die Antwort auf die andere scheint mir etwas besser zu sein, also habe ich mich dafür entschieden, es so zu machen. Außerdem ist die andere etwas breiter angelegt und deckt auch
'\n'
.0 Stimmen
Wenn Sie beabsichtigen, Ihr Programm auf etwas anderem als Ihrem eigenen Laptop laufen zu lassen, verwenden Sie niemals die
endl
Aussage. Vor allem, wenn Sie viele kurze Zeilen oder, wie ich oft gesehen habe, einzelne Zeichen in eine Datei schreiben. Die Verwendung vonendl
ist bekannt dafür, vernetzte Dateisysteme wie NFS zu zerstören.0 Stimmen
stackoverflow.com/a/30968225/3163618 kann es einen erheblichen Leistungsunterschied geben.