为什么/何时 cout 缓冲区自动刷新?

Căt*_*rbu 3 c++ buffer cout

我从这里了解到,如果我要输出字符而不刷新缓冲区(使用endlcin),则在程序结束之前它们不会出现在我的控制台上。

所以我尝试做一个无限循环:

for(;;)
{
    std::cout << "a" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

和不刷新缓冲区相同:

for(;;)
{
    std::cout << "a";
}
Run Code Online (Sandbox Code Playgroud)

它们都永远输出a,我可以观察到的唯一区别是后一个版本的代码在开始输出字母之前有一些延迟时间。第一个立即开始。

我期望第二个仅当break循环中有 a 时才输出字符,并且程序将被终止。

Chr*_*sMM 5

您是正确的std::endl,或者使用std::cin会导致发生刷新,并且内容会立即输出。std::endl相当于std::cout.put('\n'); std::cout.flush();,其中 asstd::cinstd::cerrtie()d std::cout,因此对其中任何一个的任何操作都会std::cout.flush()为您执行。

然而,在第二种情况下,std::cout仍然有一个底层输出序列 (an std::streambuf),它是指定的大小。一旦该缓冲区已满,流就会自动刷新,并且您可以将输出发送到控制台。填充这个缓冲区就是您所看到的您提到的延迟时间