4點和3點
與第4點開始,因爲一切在它和3點鉸鏈,因爲它是緊密相關的。
當您刷新流時,您將獲取流存儲的所有數據並將其寫入由流表示的底層介質。
當它被刷新時,它被完成,提交併準備好被外界觀察(或多或少,支持流的操作系統和硬件也可能延遲寫入,但是沒有太多可以這樣做)。直到它被刷新後才能讀取它。如果它從未被刷新,則無法讀取它。
事情是你不想經常寫入IO,因爲任何從CPU中出來的東西都會比呆在CPU中的時間多得多。有時候會慢幾萬倍。在CPU內部,你有千兆赫茲的並行總線,每次移動數據32位或更多位。外面你有兆赫茲經常移動一點一次。
拿一個文件作爲一個典型的例子。不僅是驅動器訪問運行在CPU的速度的一小部分,但如果每一個字節直接到磁盤,然後爲每個字節你可能要
- 發現字節的磁盤上的模擬。
- 將該字節周圍的扇區加載到內存中。所以不是移動一個字節,而是移動數百或者數千個字節。通常爲512字節或4096字節。
- 以字節爲扇區存儲
- 編寫部門在內存中回磁盤
殘酷。想象一下這樣做幾百次或幾千次來寫一個字符串。但是,如果你只寫了字符串,當它太大或無法完成時呢?如果你用扇區而不是字節來寫?那麼你可以
- 找到該字節的模擬磁盤上的扇區。
- 存儲行業寫入磁盤
一個操作可能數千字節的一次性。
點2
2點回到第四點/三相的,你看不懂,你做什麼不平齊。如果你想在屏幕上看到一個特定的輸出,並且你想現在看到它,你需要刷新。如果你想在程序崩潰之前得到一個調試消息,並且很可能會終止而不會在屏幕上顯示最後幾條絕對必要的消息,你可以刷新。歷史充滿了程序員在錯誤的地方尋找錯誤的地方,因爲他們沒有得到最後幾個未刷新的錯誤消息。
您正在交易程序速度的相對確定性,您將在需要查看時看到一條重要消息。
點1
點1呼叫回點2 std::endl
既是線的端部和沖洗流的指令。只有在需要線尾和沖水時,纔會謹慎使用它。如果您不需要衝洗,只需發送和結束行:'\n'
。
以皮特貝克爾的建議,並使用std::cerr
錯誤和儘可能調試。這就是它的目的。它運作蠻力和無知。這是痛苦的。這很慢。它幾乎總是有效的。
爲什麼要關心只在調試期間執行的語句的性能? – rightfold
#3的答案就在你所引用的內容中:「如果程序崩潰,輸出可能會留在緩衝區中,導致程序崩潰的錯誤推論。」 – interjay
請注意,最簡單的方法是使用'std :: cerr'開頭。 –