endl和'\n'的区别

9 浏览
0 Comments

endl和'\n'的区别

可能重复:
\nC++: “std::endl” vs “\\n” \n我有一个简单的程序,我进行了测试,发现endl对我的程序造成了严重的破坏。使用endl时,我的程序运行时间为100+ ms,而使用\'\\n\'时,时间降低到~50ms。\n有人能告诉我为什么会有这样的差异吗?\n附注:我确实阅读了其他帖子,其中一些帖子在某种程度上解释了它们各自的作用,但是std::flush真的需要这么长的时间吗?\n或者还有可能有其他解释吗?

0
0 Comments

在C++中,有两种方式可以在输出流中插入换行符:使用endl操纵符或者直接插入'\n'字符。然而,这两种方式之间存在一些差异。

差异的原因在于endl操纵符比直接插入'\n'字符多了一个昂贵的flush()操作。根据C++标准中的规定,endl操纵符的效果是先调用os.put(os.widen('\n'))将换行符插入输出流中,然后调用os.flush()来刷新输出流。最后,endl操纵符返回输出流本身。

这个flush()操作会导致输出流中的数据被立即刷新到目标设备,比如终端或者文件。然而,这个操作是相对昂贵的,因为它会导致I/O操作,可能会降低程序的性能。因此,如果我们只是希望在输出流中插入一个换行符,而不需要立即刷新输出流,直接插入'\n'字符可能是更好的选择。

如果我们希望避免flush()操作,并且在输出流中插入换行符,可以使用'\n'字符代替endl操纵符。这样做可以提高程序的性能,尤其是在大量输出操作的情况下。但是需要注意的是,如果我们使用了std::endl,并且确实需要立即刷新输出流,那么endl操纵符是一个很好的选择。

endl操纵符和'\n'字符都可以在输出流中插入换行符。然而,endl操纵符比直接插入'\n'字符多了一个昂贵的flush()操作。如果我们不需要立即刷新输出流,直接插入'\n'字符可能是更好的选择,可以提高程序的性能。但是如果我们确实需要立即刷新输出流,那么endl操纵符是一个很好的选择。

0
0 Comments

在C++中,使用std::endl会输出一个换行符,并且刷新缓冲区。正如你发现的那样,刷新操作可能是一个相当昂贵的操作。

这个问题的出现原因是std::endl会刷新缓冲区,而\n不会。因此,当我们使用std::endl的时候,会发生缓冲区的刷新,而这个刷新操作可能会消耗较多的时间。

解决这个问题的方法是使用\n来代替std::endl。因为\n不会刷新缓冲区,所以可以避免不必要的性能损耗。

如果你对这个问题还有疑问,可以比较一下以下三种情况的执行时间:(1)使用std::endl;(2)使用\n;(3)使用\n后再加上flush

毫无疑问,我已经尝试过了,差异是显而易见的。我意识到flush会发生,但并不知道它是一个如此昂贵的操作。非常感谢。

也许刷新操作的开销取决于需要刷新的内容的多少,所以很难预测这个操作会有多昂贵。

0