2013-02-23 13 views
52

Sto imparando C++ e ho trovato qualcosa che non riesco a capire:Cosa significa flushing del buffer?

buffer di uscita può essere esplicitamente arrossato per forzare il buffer di essere scritta. Per impostazione predefinita, la lettura di cin svuota cout; viene inoltre svuotato quando il programma termina normalmente.

Svuotamento del buffer (ad esempio un buffer di output): cancella il buffer eliminando tutto in esso o cancella il buffer emettendo tutto in esso? O lo svuotamento del buffer significa qualcosa di completamente diverso?

+3

"Emissione". La tua seconda ipotesi è corretta. –

risposta

3

Cancellare il buffer emettendo tutto.

72

Considera di scrivere su un file. Questa è un'operazione costosa. Se nel tuo codice scrivi un byte alla volta, ogni scrittura di un byte sarà molto costosa. Quindi, un modo comune per migliorare le prestazioni è archiviare i dati che si stanno scrivendo in un buffer temporaneo. Solo quando c'è un sacco di dati è il buffer scritto nel file. Rimandando le scritture e scrivendo un blocco di grandi dimensioni in un colpo solo, le prestazioni sono migliorate.

Con questo in mente, lo svuotamento del buffer è l'atto di trasferire i dati dal buffer al file.

Questo cancella il buffer eliminando tutto in esso o cancella il buffer emettendo tutto in esso?

Quest'ultimo.

+0

Grazie. un'altra cosa. Leggendo cin flushes cout. Questo "reading cin" significa quando l'utente inserisce qualcosa o quando viene richiesto all'utente di inserire qualcosa? –

+2

La lettura di cin si verifica quando si utilizza l'operatore di streaming per leggere da cin. In genere si desidera eseguire il flush del cout quando si legge perché altrimenti l'input potrebbe apparire prima del prompt. –

+1

@DavidHeffernan Per quanto ne so, non hai mai bisogno di svuotare cout prima di cin, perché cin e cout sono legati (Stroustrup, The C++ Programming Language, [io.tie]). – sturmer

14

quali hai citato la risposta:

buffer di uscita può essere esplicitamente arrossato per forzare il buffer da scrivere.

Cioè, potrebbe essere necessario "svuotare" l'output per farlo scrivere sul flusso sottostante (che può essere un file, o negli esempi elencati, un terminale).

In genere, stdout/cout è buffer di riga: l'output non viene inviato al sistema operativo finché non si scrive una nuova riga o si svuota esplicitamente il buffer. Il vantaggio è che qualcosa come std::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endl causa una sola scrittura sul "file" sottostante invece di sei, che è molto meglio per le prestazioni. Lo svantaggio è che qualcosa di simile

for (int i=0; i<5; i++) { 
    std::cout << "."; 
    sleep(1); 
} 
std::cout << "\n"; 

uscita volontà "....." in una sola volta. In questi casi, è necessario un ulteriore << flush per garantire che l'output venga visualizzato.

lettura cin vampate cout in modo da non avete bisogno di un filo esplicito per fare questo:

std::string colour; 
std::cout << "Enter your favourite colour: "; 
std::cin >> colour; 
+0

Fare questo per (int i = 0; i <5; i ++) {std :: cout << "."; sleep (1); } std :: cout << std :: endl; non stampa ..... subito. Li stampa con 1 millisecondo in mezzo. Lo noterai di più quando utilizzi sleep (1000) –

+0

@MohamedAhmedNabil Sembra che tu stia confondendo 'sleep()' (POSIX) con 'Sleep()' (Windows) –

+0

puoi spiegare la differenza? –