0

手動でフラッシュを呼び出す以外に、フラッシュcoutまたはSTDOUT(printf)フラッシュする条件は何ですか?

現在のスコープまたは現在の関数を終了しますか? 時間制ですか?バッファがいっぱいになったときにフラッシュしますか (およびバッファの大きさはどれくらいですか)?

4

1 に答える 1

2

ストリームの場合<stdio.h>、 を使用してバッファリング モードを設定できますsetvbuf()。次の 3 つのバッファリング モードを使用します。

  1. _IOFBF: バッファーがいっぱいになったとき、またはフラッシュが明示的に要求されたときに、バッファーがフラッシュされます。
  2. _IOLBF: 改行が見つかったとき、バッファがいっぱいになったとき、またはフラッシュが要求されたときに、バッファがフラッシュされます。
  3. _IONBF: ストリームはバッファリングされません。つまり、出力は利用可能になるとすぐに送信されます。

stdoutのデフォルト設定は_IOLBFstderrあり_IONBF、他のストリームでは であるという印象を受けました_IOFBF。ただし、C 標準を見てみると、C ストリームのデフォルトが何であるかについての兆候は見つかりません。

_IOLBF標準 C++ ストリーム オブジェクトの場合、 :に相当するものはありませstd::endlん。ただし、 にはいくつかの設定があります。'\n'std::flushstd::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::coutは、 tie()d ~std::cinです。
  5. 重要なことをほとんど忘れていました:標準 C++ ストリーム ( 、、および対応するもの) でstd::ios_base::sync_with_stdio()呼び出されなかった場合は、おそらく完全にバッファリングされていません! 標準の C ストリームと C++ ストリームのデフォルト設定では、混在した方法で使用できます。ただし、C ライブラリは一般に C++ ライブラリを認識しないため、これは C++ 標準ストリーム オブジェクトがバッファリングを実行できないことを意味します。使用は標準 C++ ストリーム オブジェクトの主要なパフォーマンスの問題です!falsestd::cinstd::coutstd::cerrstd::clogwchar_tstd::ios_base::sync_with_stdio(true)std::sync_with_stdio(true)

C でも C++ でも、バッファのサイズを実際に制御することはできません。ゼロ以外のバッファを設定する要求は無視でき、通常は無視されます。つまり、ストリームはほぼランダムな場所でフラッシュされます。

于 2013-11-10T20:24:52.243 に答える