为什么/何时自动刷新 cout 缓冲区?
Why / when is cout buffer automatically flushed?
我从 here 了解到,如果我要在不刷新缓冲区的情况下输出字符(使用 endl
或 cin
),在程序结束之前它们不会出现在我的控制台上.
所以我试着做一个无限循环:
for(;;)
{
std::cout << "a" << std::endl;
}
与不刷新缓冲区相同:
for(;;)
{
std::cout << "a";
}
它们都永远输出a
,我能观察到的唯一区别是后一个版本的代码在开始输出字母之前有一些延迟时间。第一个立即开始。
我原以为只有当循环中有 break
时,第二个才会输出字符,程序将终止。
你是正确的,std::endl
,或使用 std::cin
,导致发生刷新,并立即输出内容。 std::endl
等同于 std::cout.put('\n'); std::cout.flush();
,其中 std::cin
和 std::cerr
是 tie()
d 到 std::cout
,因此对其中任何一个的任何操作都会执行std::cout.flush()
给你。
然而,在第二种情况下,std::cout
仍然有一个底层输出序列(一个std::streambuf
),这是一个指定的大小。一旦此缓冲区已满,流将自动刷新,并且您可以将输出发送到控制台。填充此缓冲区就是您所看到的延迟时间。
我从 here 了解到,如果我要在不刷新缓冲区的情况下输出字符(使用 endl
或 cin
),在程序结束之前它们不会出现在我的控制台上.
所以我试着做一个无限循环:
for(;;)
{
std::cout << "a" << std::endl;
}
与不刷新缓冲区相同:
for(;;)
{
std::cout << "a";
}
它们都永远输出a
,我能观察到的唯一区别是后一个版本的代码在开始输出字母之前有一些延迟时间。第一个立即开始。
我原以为只有当循环中有 break
时,第二个才会输出字符,程序将终止。
你是正确的,std::endl
,或使用 std::cin
,导致发生刷新,并立即输出内容。 std::endl
等同于 std::cout.put('\n'); std::cout.flush();
,其中 std::cin
和 std::cerr
是 tie()
d 到 std::cout
,因此对其中任何一个的任何操作都会执行std::cout.flush()
给你。
然而,在第二种情况下,std::cout
仍然有一个底层输出序列(一个std::streambuf
),这是一个指定的大小。一旦此缓冲区已满,流将自动刷新,并且您可以将输出发送到控制台。填充此缓冲区就是您所看到的延迟时间。