建议C++程序员经常编写类似以下的代码:
std::cout << "output: " << i << " and " << j << std::flush;
//more
std::cout << "ending newline." << std::endl; //endl does flush
换句话说,在没有使用 endl
的输出行中,我们是否应该经常使用 flush
,以防万一?或者在大多数平台上这已经不再需要了吗?
建议C++程序员经常编写类似以下的代码:
std::cout << "output: " << i << " and " << j << std::flush;
//more
std::cout << "ending newline." << std::endl; //endl does flush
换句话说,在没有使用 endl
的输出行中,我们是否应该经常使用 flush
,以防万一?或者在大多数平台上这已经不再需要了吗?
一般情况下,程序不需要频繁刷新缓冲区。刷新缓冲区是在以下几种情况下需要使用的:
如果不需要缓冲区,则最好在一开始禁用缓冲区,而不是频繁刷新。
大多数情况下,启用缓冲区对程序有益。有时它们会生成一些字符,有时它们会输出一堆行。
在我几十年的工程经验中,最显著的性能提升通常是通过改进缓冲区实现的。有时通过将默认的FILE
缓冲区大小从512字节(默认值)增加到4K或32K(有时更高)。有时通过添加缓存层。通常每次通过操作系统的i/o系统旅行都会带来很高的开销。减少系统调用的总数量(通常)是一种简单而高效的方案来提高性能。
cin
和cout
。但是其他的ostream
必须明确地单向或双向同步。 - wallyk通常情况下,频繁调用flush不是一个好习惯,因为如果你经常写入IO, 而频繁调用flush会导致程序变慢。你可以通过显式地使用std::endl
或std::flush
来控制flush的操作(std::endl
会将\n
插入到流中,然后再调用flush
)。
@StackedCrooked in the C++ Lounge 进行了一项关于flush和不flush成本的实验: http://coliru.stacked-crooked.com/view?id=55c830cf9a144559f31963de41fa9405-f674c1a6d04c632b71a62362c0ccfc51
在重复使用flush时,不flush的性能表现相对较好,而每次调用flush都会增加一定的开销: 手动使用std::flush
并不是很必要。只需在程序结束或关键代码段结束时执行一次即可。
还应该注意,在与用户交互之前可能需要刷新一下输出流,以免在日志文件或其他地方中遗漏了用户应该看到的内容。
编辑: 相关比喻: In simple terms, what is the purpose of flush() in ostream
std::flush
和std::endl
在意外断电时 不能 防止数据丢失,仅能在意外崩溃时起作用。它们会刷新到操作系统,但不会刷新到磁盘。 - Mooing Duck\n
的唯一原因是如果您不想刷新” - 您的意思是不使用\n
的唯一原因是如果您想要刷新。 - Christian Rau