【发布时间】:2021-04-19 19:41:46
【问题描述】:
我完全是 C++ 初学者,所以如果我的问题听起来很愚蠢,我深表歉意。
我一直在阅读一本关于流缓冲区的简单介绍的书,在某些情况下刷新缓冲区很重要,因此为了理解效果,我运行了以下代码:
代码1:
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
int main()
{
for (int i = 1; i <= 5; ++i)
{
cout << i << " ";
this_thread::sleep_for(chrono::seconds(1));
}
cout << endl;
return 0;
}
代码2:
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
int main()
{
for (int i = 1; i <= 5; ++i)
{
cout << i << " " << flush;
this_thread::sleep_for(chrono::seconds(1));
}
return 0;
}
两个代码给出相同的输出,完全没有区别,它们打印 1 sleep for 1 second then 2, sleep for another second,依此类推。
我尝试在 DevC++ 和 CodeBlocks 中运行代码,结果相同。
书上说code1的结果——>“程序等待5秒,一次打印所有数字”,code2的结果——>“程序打印数字等待1秒,打印第二个数字等等”。
我真的不明白出了什么问题。
【问题讨论】:
-
尝试从命令行运行已编译的非
flushing 程序。如果您从 IDE 中运行它,它可能会自动刷新缓冲区。例如,如果我在我的 linux bash shell 中运行它,它会等待 5 秒,然后一次打印所有五个数字。 -
cout输出通常被缓冲,但不是必需。本书描述的两种行为是大多数实现中的典型行为,当cout是行缓冲时,这意味着在打印换行符(或缓冲区填满)之前不会刷新缓冲区.std::endl和std::flush都强制立即刷新