簡體   English   中英

什么時候輸出緩沖區沖洗?

[英]When does output buffer flush?

除了手動調用flush之外, coutSTDOUT(printf)會刷新的條件是什么?

退出當前范圍或當前功能? 是時候定時嗎? 緩沖區滿時刷新(緩沖區有多大)?

對於<stdio.h>流,您可以使用setvbuf()設置緩沖模式。 它需要三種緩沖模式:

  1. _IOFBF :緩沖區在填滿或顯式請求刷新時刷新。
  2. _IOLBF :當找到換行符,緩沖區已滿或請求刷新時,刷新緩沖區。
  3. _IONBF :流是無緩沖的,即輸出盡快發送。

我有一個impressino, stdout的默認設置是_IOLBF ,對於stderr它是_IONBF ,而對於其他流,它是_IOFBF 但是,查看C標准,我沒有找到任何關於任何C流的默認值的指示。

對於標准C ++流對象,沒有與_IOLBF等價的東西:如果你想要行緩沖,你可以使用std::endl或者最好使用'\\n'std::flush 但是std::ostream有一些設置:

  1. 您通常可以使用buf.pubsetbuf(0, 0)將流轉為無緩沖。 由於流緩沖區可以由用戶實現,因此不能保證相應的設置緩沖區的調用受到尊重。
  2. 您可以設置std::ios_base::unitbuf ,這會導致在每次[正確實現]輸出操作后刷新流。 默認情況下, std::ios_base::unitbuf僅為std::cerr設置。
  3. 正常設置std::ostream在緩沖區已滿或顯式請求時刷新緩沖區,不幸的是, std::endl發出一個明確的請求來刷新緩沖區(在很多情況下會導致性能問題,因為它往往是用作'\\n'的替代品,它不是。
  4. 一個有趣的是能力in.tie()的輸出緩沖器的輸入流:如果in.tie()包含一個指向一個std::ostream這個輸出流將被嘗試從讀取之前沖洗in (假設正確實現了輸入操作符,當然)。 默認情況下, std::couttie() d到std::cin
  5. 幾乎忘了一個重要的一個:如果std::ios_base::sync_with_stdio()沒有用false調用標准C ++流( std::cinstd::coutstd::cerrstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM