23

是否建议 C++ 程序员经常编写类似的行

std::cout << "output: " << i << " and " << j << std::flush;
//more
std::cout << "ending newline." << std::endl; //endl does flush

换句话说,在没有 的输出行中endl,我们是否应该经常使用flush,以防万一?或者这些天在大多数平台上不再需要这个?

4

2 回答 2

20

您的普通程序不需要频繁冲洗。冲洗更接近于在某些情况下需要的特殊情况:

  • 与人或其他系统交互:在等待输入之前刷新输出是明智的。
  • 休眠一段时间:在延长睡眠或等待之前刷新简化了日志文件的检查,使数据库大部分时间保持一致等。

如果不需要缓冲,最好首先禁用缓冲,而不是大量刷新。

大多数时候,程序通过启用缓冲而受益。有时它们会在这里和那里生成一些字符。其他时候,他们会输出一连串的线条。

在我几十年的工程生涯中,我最显着的性能提升通常是通过改进缓冲来实现的。有时通过将FILE超过 512 字节(默认)的默认缓冲区大小增加到 4K 或 32K(有时更高)。其他时候通过添加一层缓冲或缓存。通常每次通过操作系统的 i/o 系统都会有很高的开销。减少系统调用的总数(通常)是提高性能的简单且高效的方案。

于 2013-06-28T17:14:38.270 回答
15

刷新通常不是最好的习惯,因为如果您经常向 IO 写入数据,刷新有时会减慢您的程序。std::endl您可以通过显式使用或std::flushstd::endl只需将 a\n插入流然后调用flush)来控制刷新方式。

@StackedCrooked 在 C++ Lounge中进行了一项关于冲洗与不冲洗成本的实验:http ://coliru.stacked-crooked.com/view?id=55c830cf9a144559f31963de41fa9405-f674c1a6d04c632b71a62362c0ccfc51

重复使用后不刷新的效果相对较好,而每次调用它时刷新都会增加一些开销:老实说,最好不要手动std::flush处理流。只需在程序结束时或代码关键部分结束后执行一次。

还需要注意的是,您可能应该在对用户执行任何操作之前刷新,因此程序不会将用户应该在日志文件或其他地方看到的输出写入内容。

编辑:相关类比:简单来说,ostream 中的 flush() 的目的是什么

于 2013-06-28T17:18:32.130 回答