2016-11-16 2 views
0

Ich habe ein wirklich einfaches Programm, das Zeilen mit cout druckt und nach jeder Zeile schläft. Alles ist gut und gut für etwa 7 Iterationen, da der Puffer an keinem Punkt deutlich gespült wird. Danach nehme ich an, dass nur ein Teil des Puffers bei jeder Iteration gelöscht wird.Ich verstehe nicht, gepufferte Ausgabe und cout

Ich habe ein paar Fragen zu diesem Verhalten:

  1. Wenn der Puffer angeblich groß genug ist, paßt ~ 7 Zeilen der Ausgabe, warum wird der Puffer eine Zeile zu einem Zeitpunkt gespült?
  2. Wenn dieser Puffer tatsächlich auf diese Weise gespült wird, was ist dann der Vorteil? Warum wird nicht der ganze Puffer auf einmal gespült?
  3. Ist es nur ein Zufall, dass genau die gleiche Anzahl von Zeichen wie meine Zeilenlänge in die Ausgabe geschrieben wird, oder wird der Cout-Puffer basierend auf Zeilenendezeichen wie '\ n' 'intern gelöscht?

    int main(){ 
    
    for(int i = 0; i < 100; ++i){ 
    
    std::cout << "This is line " << i << '\n'; 
    Sleep(1000); 
    
    } 
    
    return 0; 
    } 
    
+0

Es druckt etwa jede Sekunde, wie Sie es erwartet haben, für mich, mit oder ohne '\ n'. –

Antwort

0

Sie scheinen anzunehmen, dass der Puffer nicht geschrieben werden, bis er voll ist. Wahrscheinlich wird ein asynchrones Schreiben mit nur einem Ausgangsbyte gestartet. Der leere Pufferbereich wird verwendet, um während des asynchronen Schreibvorgangs Zeichen zu empfangen. Wenn der aktuelle Schreibvorgang abgeschlossen ist, wird, wenn zusätzliche Zeichen im Puffer vorhanden sind, ein neuer asynchroner Schreibvorgang gestartet. Der Prozess müsste nur beim Schreiben blockieren, wenn der Puffer voll ist.