[英]What exactly is flushing?
我是編碼和編程的新手(實際上從今天開始)。 我一直在觀看一些視頻並閱讀幾本書的開頭以查看我可以點擊哪些內容,但我無法理解其中的一些內容。
在基本的“Hello World”介紹中,一個視頻使用了endl
,另一個使用了\\n
。 我想更多地了解兩者之間的差異。
所以,我明白之間的差別endl
和\\n
是endl
將刷新代碼,而\\n
不會,這使得endl
慢。 我可以在谷歌上搜索這么多。
但是,在搜索沖洗 C++ 時,由於行話,我無法弄清楚它的含義。
沖洗是什么意思,何時以及為什么要這樣做? 什么是緩沖區?
如果可以,請以非常基本的方式解釋它。
緩沖區是用於存儲可能需要一些時間的進程輸入的臨時內存。
它可以是不丟失任何數據。 想象一下快速計算機和慢速計算機之間的通信。 快速計算機可能以比慢速計算機可以處理的更高的速率發送字節,而慢速計算機正在處理一個字節,然后其他人仍然到達並存儲在等待處理的緩沖區中。
或者,它可以是出於性能原因。 所有操作都有一個靜態時間成本,它與操作處理的數據大小無關(可能需要初始化一些數據,等待資源,...)。 如果該成本不可忽略,那么盡可能少地支付該成本可能會很有趣。 所以我們使用緩沖區來收集更多數據並將多個操作合並為一個。
對於您的情況,打印到屏幕的靜態時間不可忽略,這就是默認情況下使用緩沖區的原因,並且只有在接收到足夠的字節時才打印數據。
刷新緩沖區意味着清空它並強制處理其中的數據。 如果您想立即處理少量數據,它會很有用。
例如,如果您想打印“請輸入您的年齡:”並等待用戶輸入一個數字,則最好讓用戶實際看到該請求! 所以在這里,刷新緩沖區是強制性的。
但是如果你打印一個文本流(想想一個程序在編譯一個大項目時像編譯器一樣打印許多文本)最好不要刷新並讓緩沖區填滿,這樣你就不會為每個塊花費靜態時間發送(例如,編譯器案例的每個源文件)。 並在最后一個塊之后刷新以確保我們不會在緩沖區中間結束,這很有可能。
@Nicolas Dusart 給出了很好的答案。 這是相同的信息,但從不同的上下文進行解釋。
“打印到屏幕”可能意味着兩件事:
現在,當您調用“print”時,系統會智能地將其解釋為最終. 但是,您可以要求它立即打印到屏幕上。
為什么這種令人困惑的行為是智能的? 好吧,想象一下你所有的阿姨都過來了,你想給他們端茶。
盡管這兩個問題幾乎完全相同,但以完全不同的方式回答它們是有道理的。 泡茶時,只需要將水燒開一次。 而你只想跑到廚房一次。 盡管您想分發一杯茶 3 次。 (我有 3 個阿姨哈哈)
現在,因為我們不是在談論跑到廚房並完成記住的請求,而是在談論處理緩沖區中的數據,所以我們不稱這個動作為記住請求並立即跑到廚房,而是我們稱之為緩沖和沖洗。
因此,明確回答您的問題(並完全按照我們的好朋友所說的重復一遍):“flush”的意思是“立即處理緩沖區中的數據”。 它與“清除其數據緩沖區”同義。
當我們考慮緩沖請求以供稍后完成的情況時,這兩種含義之間的區別真的很模糊。 作為一名工程師,我認為這兩種含義都是該術語的有效用法。 作為一名計算機科學專業的學生,刷新對我來說僅意味着“清除緩沖區”。
刷新,意味着清空緩沖區。
現在,緩沖區是用於存儲數據的臨時存儲區域。
endl 和 \\n 都可用於打印換行符,但這兩者之間存在細微差別:
在 endl 的情況下,通過使用內部調用來清除緩沖區以刷新緩沖區
在 \\n 的情況下,會打印換行符但不會刷新緩沖區,因為沒有進行額外的調用
所以在性能方面,endl 比 \\n 好
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.