【问题标题】:When does cout flush?cout什么时候刷新?
【发布时间】:2014-04-16 05:11:00
【问题描述】:

我知道endl 或调用flush() 会刷新它。我也知道当你在cout 之后调用cin 时,它也会刷新。以及程序退出时。是否还有其他情况cout 刷新?

我只是写了一个简单的循环,并没有刷新它,但我可以看到它正在打印到屏幕上。为什么?谢谢!

for (int i =0; i<399999; i++) {

        cout<<i<<"\n";

}

完成的时间也和endl一样,都是7秒左右。

for (int i =0; i<399999; i++) {

        cout<<i<<endl;

}

【问题讨论】:

  • 这是一个实现细节,总是取决于输出是否被重定向。如果不是,那么出于显而易见的原因,冲洗是自动的,您希望立即看到您遇到的任何内容。大多数 CRT 都有一个 isatty() 辅助函数,用于确定是否需要自动刷新。

标签: c++ buffer iostream cout


【解决方案1】:

标准没有严格的规定——只有endl 会刷新,但实现可以在它“喜欢”的任何时候刷新。

当然,小于 400K 的所有数字的总和是 6 * 400K = 2.4MB,这不太可能适合缓冲区,并且循环运行速度足够快,如果需要,您不会注意到每个输出之间有一段时间。试试这样的:

 for(int i = 0; i < 100; i++)
 {
   cout<<i<<"\n";
   Sleep(1000);
 }

(如果您使用的是基于 Unix 的操作系统,请改用 sleep(1) - 或添加一个需要一些时间的循环等)

编辑:应该注意的是,这不能保证显示任何差异。我知道在我的 Linux 机器上,如果您在这种特定类型的场景中没有刷新,它不会输出任何内容 - 但是,某些系统可能会执行“在 \n 上刷新”或类似的操作。

【讨论】:

  • 我测的时间怎么样?没有endl 的那个不应该更快,即使它有时会刷新,它应该不那么频繁地刷新,对吗?我试过你的代码,很好。谢谢!
  • 它很可能被实际输出到屏幕所需的时间所取代。如果您将输出发送到 NUL: 或类似的,您可能会看到一个小的差异(但 40 万个数字可能还不够 - 尝试几百万个)。
  • "被超越" = "被支配"。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 2018-09-21
  • 1970-01-01
  • 2020-04-06
  • 2020-01-20
  • 1970-01-01
相关资源
最近更新 更多