Sie möchten eine ungepufferte Ausgabe, wenn Sie sicherstellen möchten, dass die Ausgabe geschrieben wurde, bevor Sie fortfahren. Ein Beispiel ist ein Standardfehler unter einer C-Laufzeitbibliothek - dieser ist normalerweise standardmäßig ungepuffert. Da Fehler (hoffentlich) selten sind, möchten Sie sie sofort kennen. Auf der anderen Seite, die Standardausgabe ist einfach gepuffert , weil es dort angenommen , durchläuft es weit mehr Daten sein wird.
Ein weiteres Beispiel ist eine Protokollierungsbibliothek. Wenn Ihre Protokollnachrichten in Puffern in Ihrem Prozess gespeichert sind und Ihr Prozess den Kern entleert, besteht eine sehr gute Chance, dass die Ausgabe niemals geschrieben wird.
Darüber hinaus werden nicht nur Systemaufrufe minimiert, sondern auch Festplatten-E / A. Angenommen, ein Programm liest eine Datei byteweise. Bei ungepufferter Eingabe gehen Sie für jedes Byte auf die (relativ sehr langsame) Festplatte, obwohl sie wahrscheinlich ohnehin einen ganzen Block einlesen muss (die Festplattenhardware selbst verfügt möglicherweise über Puffer, aber Sie gehen immer noch zum Festplattencontroller Dies wird langsamer sein als der In-Memory-Zugriff.
Durch das Puffern wird der gesamte Block sofort in den Puffer eingelesen, und die einzelnen Bytes werden Ihnen aus dem (speicherinternen, unglaublich schnellen) Pufferbereich zugestellt.
Beachten Sie, dass die Pufferung viele Formen annehmen kann, wie im folgenden Beispiel:
+-------------------+-------------------+
| Process A | Process B |
+-------------------+-------------------+
| C runtime library | C runtime library | C RTL buffers
+-------------------+-------------------+
| OS caches | Operating system buffers
+---------------------------------------+
| Disk controller hardware cache | Disk hardware buffers
+---------------------------------------+
| Disk |
+---------------------------------------+
FILE
interne Puffer eines Objekts (eines Streams) vollständig von einemfgets
erforderlichen Pufferparameter unterscheidet. Das hat mich nur stundenlang verwirrt, bevor ich einen Code geschrieben habe, um es herauszufinden. QAQ