2016-11-16 87 views
0

我有一个非常简单的程序,打印行使用cout和每行后睡觉。一切都很好,约7次迭代,因为缓冲区在任何时候都不会被刷新。之后,我认为只有缓冲区的一部分在每次迭代时都被刷新。我不明白缓冲输出和cout

我对这种行为的几个问题:

  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; 
    } 
    
+0

每隔一秒就会打印一次,就像您预期的一样,对我来说,无论是否带'\ n'。 –

回答

0

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