punto 4 e il punto 3
partire con il punto 4 perché tutto il resto dipende su di esso e al punto 3 perché è strettamente correlato.
Quando si scarica lo stream, si stanno prendendo tutti i dati memorizzati dallo stream e lo si scrive sul supporto sottostante rappresentato dallo stream.
Quando viene svuotato, è fatto, impegnato e pronto per essere osservato dal mondo esterno (Più o meno Il sistema operativo e l'hardware che supporta il flusso può anche ritardare la scrittura, ma non c'è molto che tu possa fare per quello). Non puoi leggerlo finché non è stato lavato. Se non viene mai scaricato, non puoi leggerlo.
La cosa è che non si vuole scrivere su IO molto spesso perché tutto ciò che esce dalla CPU impiega una quantità di tempo non voluta rispetto a quello che rimane all'interno della CPU. A volte decine di migliaia di volte più lento. All'interno della CPU si hanno gigahertz e bus paralleli che spostano i dati 32 o più bit alla volta. All'esterno hai megahertz che si muove spesso un solo bit alla volta.
Prendere un file come un esempio classico. Non solo è l'accesso di unità in esecuzione a una frazione di una velocità della CPU, ma se ogni byte va direttamente su un disco, quindi per ogni byte potrebbe essere necessario
- trovare analogico che di byte sul disco.
- carica il settore attorno a quel byte in memoria. Quindi, invece di spostare un byte, potresti spostarti di alcune centinaia o di migliaia. Di solito 512 byte o 4096 byte.
- scrivere il byte nel settore in memoria
- scrivere settore in memoria indietro sul disco
brutale. Immagina di farlo alcune centinaia o migliaia di volte per scrivere una singola stringa. Ma cosa succede se hai scritto la stringa solo quando è diventata troppo grande da tenere o hai finito? Cosa succede se hai scritto in settori piuttosto che in byte? Quindi è possibile
- trovare il settore dell'analogo del byte sul disco.
- scrivere settore memorizzato sul disco
Un'operazione per potenzialmente migliaia di byte in un colpo.
Point 2
punto 2 torna al punto quattro/tre di non si può leggere ciò che non lo fanno a filo. Se vuoi vedere un particolare output sullo schermo e vuoi vederlo ora, lo svuoti. Se si desidera ottenere un messaggio di debug prima che il programma si blocchi, e probabilmente si interrompe senza ottenere quegli ultimi pochi messaggi assolutamente essenziali sullo schermo, si scarica. La cronologia è piena di programmatori che cercano nel posto sbagliato un errore perché non hanno ricevuto quegli ultimi messaggi di errore non aggiornati.
Stai scambiando la velocità del programma per la relativa certezza che vedrai un messaggio importante quando devi vederlo.
punto 1
punto 1 chiamate al punto 2. std::endl
è sia un'estremità di linea e un'istruzione per irrigare il flusso. Lo usi con parsimonia e solo quando hai bisogno sia di un fine linea che di un colore. Se non hai bisogno di un colore, invia e termina la riga: '\n'
.
Prendere il consiglio di Pete Becker e utilizzare std::cerr
per errori e debug, ove possibile. Questo è quello per cui è stato costruito. Funziona con la forza bruta e l'ignoranza. È doloroso. È lento. E funziona quasi sempre.
Perché ti interessano le prestazioni delle istruzioni che vengono eseguite solo durante il debug? – rightfold
La risposta al n. 3 è proprio lì in quello che hai citato: "se il programma si blocca, l'output potrebbe essere lasciato nel buffer, portando a inferenze errate su dove il programma si è bloccato". – interjay
Si noti che il modo più semplice per svuotare è usare 'std :: cerr' per iniziare. –