我不明白缓冲输出和cout

时间:2016-11-16 04:20:52

标签: c++ visual-c++

我有一个非常简单的程序,它使用cout打印行并在每行之后休眠。对于大约7次迭代,一切都很好,因为缓冲区在任何时候都没有被刷新。之后,我假设只有缓冲区的一部分在每次迭代时刷新。

我对此行为有几个疑问:

  1. 如果缓冲区大小足以容纳~7行输出,为什么缓冲区一次刷新一行?
  2. 如果这个缓冲区确实以这种方式刷新,那么它有什么优势呢?为什么不能立即刷新整个缓冲区?
  3. 将完全相同数量的字符作为行长度刷新到输出中,或者是基于行尾分隔符(如'\ n')内部刷新的cout缓冲区,这只是巧合吗?

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

1 个答案:

答案 0 :(得分:0)

您似乎假设缓冲区在填满之前不会被写入。可能会发生的是,异步写入只需一个输出字节即可启动。空缓冲区空间用于在异步写入进行时接收字符。当前写入完成时,如果/当缓冲区中有其他字符时,将启动新的异步写入。如果缓冲区已满,该过程只需要阻止写入。