2016-11-16 10 views
0

私はcoutを使って行を出力し、各行の後にスリープする非常に単純なプログラムを持っています。バッファーはどの点でも明確にフラッシュされないので、すべてが約7回の反復で良好であり、良好である。その後、私が想定しているのは、バッファの一部だけがすべての反復でフラッシュされるということです。私はバッファリングされた出力とcoutを理解していません

私はこの動作に関するいくつかの質問があります:バッファが出力の〜7行を収まるほどおそらく大きい場合

  1. を、なぜバッファは、一度に1本のラインをフラッシュですか?
  2. このバッファが実際にこのようにフラッシュされている場合、これにはどのような利点がありますか?バッファ全体が一度にフラッシュされないのはなぜですか?
  3. 正確に同じ文字数が私の行の長さとして出力にフラッシュされるか、 '\ n'のような行末の区切り文字に基づいて内部的にフラッシュされるcoutバッファですか?

    int main(){ 
    
    for(int i = 0; i < 100; ++i){ 
    
    std::cout << "This is line " << i << '\n'; 
    Sleep(1000); 
    
    } 
    
    return 0; 
    } 
    
+0

「\ n」の有無にかかわらず、あなたが期待したように、約1秒ごとに印刷されます。 –

答えて

0

あなたはそれがいっぱいになるまでバッファが書き込まれないことを前提としているようです。たぶん、非同期書き込みはわずか1出力バイトで開始されます。空のバッファスペースは、非同期書き込みの進行中に文字を受け取るために使用されます。現在の書き込みが完了すると、バッファに追加の文字がある場合、新しい非同期書き込みが開始されます。このプロセスは、バッファがいっぱいになった場合にのみ書き込みをブロックする必要があります。

関連する問題