[英]when is a opportune moment to flush the output buffer and some basic c++
[英]When does output buffer flush?
除了手動調用flush之外, cout
或STDOUT(printf)
會刷新的條件是什么?
退出當前范圍或當前功能? 是時候定時嗎? 緩沖區滿時刷新(緩沖區有多大)?
對於<stdio.h>
流,您可以使用setvbuf()
設置緩沖模式。 它需要三種緩沖模式:
_IOFBF
:緩沖區在填滿或顯式請求刷新時刷新。 _IOLBF
:當找到換行符,緩沖區已滿或請求刷新時,刷新緩沖區。 _IONBF
:流是無緩沖的,即輸出盡快發送。 我有一個impressino, stdout
的默認設置是_IOLBF
,對於stderr
它是_IONBF
,而對於其他流,它是_IOFBF
。 但是,查看C標准,我沒有找到任何關於任何C流的默認值的指示。
對於標准C ++流對象,沒有與_IOLBF
等價的東西:如果你想要行緩沖,你可以使用std::endl
或者最好使用'\\n'
和std::flush
。 但是std::ostream
有一些設置:
buf.pubsetbuf(0, 0)
將流轉為無緩沖。 由於流緩沖區可以由用戶實現,因此不能保證相應的設置緩沖區的調用受到尊重。 std::ios_base::unitbuf
,這會導致在每次[正確實現]輸出操作后刷新流。 默認情況下, std::ios_base::unitbuf
僅為std::cerr
設置。 std::ostream
在緩沖區已滿或顯式請求時刷新緩沖區,不幸的是, std::endl
發出一個明確的請求來刷新緩沖區(在很多情況下會導致性能問題,因為它往往是用作'\\n'
的替代品,它不是。 in.tie()
的輸出緩沖器的輸入流:如果in.tie()
包含一個指向一個std::ostream
這個輸出流將被嘗試從讀取之前沖洗in
(假設正確實現了輸入操作符,當然)。 默認情況下, std::cout
是tie()
d到std::cin
。 std::ios_base::sync_with_stdio()
沒有用false
調用標准C ++流( std::cin
, std::cout
, std::cerr
和std::clog
及其wchar_t
對應物) ) 可能完全沒有緩沖! 使用std::ios_base::sync_with_stdio(true)
的默認設置,可以以混合方式使用標准C和C ++流。 但是,由於C庫通常無視C ++庫,這意味着C ++標准流對象無法進行任何緩沖。 使用std::sync_with_stdio(true)
是標准C ++流對象的主要性能問題! 無論是在C語言還是在C ++中,您都無法控制緩沖區的大小:允許忽略設置非零緩沖區的請求,通常會被忽略。 也就是說,流將幾乎隨機地刷新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.