手動でフラッシュを呼び出す以外に、フラッシュcout
またはSTDOUT(printf)
フラッシュする条件は何ですか?
現在のスコープまたは現在の関数を終了しますか? 時間制ですか?バッファがいっぱいになったときにフラッシュしますか (およびバッファの大きさはどれくらいですか)?
ストリームの場合<stdio.h>
、 を使用してバッファリング モードを設定できますsetvbuf()
。次の 3 つのバッファリング モードを使用します。
_IOFBF
: バッファーがいっぱいになったとき、またはフラッシュが明示的に要求されたときに、バッファーがフラッシュされます。_IOLBF
: 改行が見つかったとき、バッファがいっぱいになったとき、またはフラッシュが要求されたときに、バッファがフラッシュされます。_IONBF
: ストリームはバッファリングされません。つまり、出力は利用可能になるとすぐに送信されます。stdout
のデフォルト設定は_IOLBF
でstderr
あり_IONBF
、他のストリームでは であるという印象を受けました_IOFBF
。ただし、C 標準を見てみると、C ストリームのデフォルトが何であるかについての兆候は見つかりません。
_IOLBF
標準 C++ ストリーム オブジェクトの場合、 :に相当するものはありませ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()
呼び出されなかった場合は、おそらく完全にバッファリングされていません! 標準の C ストリームと C++ ストリームのデフォルト設定では、混在した方法で使用できます。ただし、C ライブラリは一般に C++ ライブラリを認識しないため、これは C++ 標準ストリーム オブジェクトがバッファリングを実行できないことを意味します。使用は、標準 C++ ストリーム オブジェクトの主要なパフォーマンスの問題です!false
std::cin
std::cout
std::cerr
std::clog
wchar_t
std::ios_base::sync_with_stdio(true)
std::sync_with_stdio(true)
C でも C++ でも、バッファのサイズを実際に制御することはできません。ゼロ以外のバッファを設定する要求は無視でき、通常は無視されます。つまり、ストリームはほぼランダムな場所でフラッシュされます。