What is the C++ iostream endl fiasco?
我在听安德烈·亚历山德里斯库在谷歌上关于D编程语言的演讲时,他抛出了一行关于"endl"失败的话。我只是认为endl是表示行结束并为流刷新缓冲区的首选方法。为什么它被认为是一场惨败?我不应该在代码中使用它吗?
- 贴上它!贴上它!
- @伊尔贾恩:你是100%对的。我知道它冲破了缓冲区,在2008年的CEOI比赛中仍然输了约75分!坏习惯!
- @我的老师Ildjarn坚持说我们用std::endl代替
,我认为这很奇怪。但同样,我们只是在编写简单的控制台程序。但是,他再次认为在循环中初始化一个(pod)变量是一个潜在的性能问题…
- 我添加了链接,也在erdani.com上找到了链接
- @托德,那是亚历山大斯库斯的主页:)
从我的评论转载:
(我假设)他只是意味着许多,特别是新的C++程序员使用EDOCX1 0而不是EDCOX1,1,用于新行,频繁地刷新,并且潜在地使程序的性能变差。
也就是说,大多数人都被教导,std::endl是将新行插入流中的规范方法,尽管它很少需要或适合对其进行刷新。
有人认为,std::endl甚至不应该在标准中,因为它是非常不合适的,而且无论如何也不会比'
' << std::flush节省大量的打字成本。
TR;DR(S):
- 最后,std::endl除了通常性能较差和打字较多外,什么也不买。
- 它有它的用途,但它们比它在大多数大型代码库中的使用频率要少得多,因此…
- 它的效用是高度可疑的,它的普遍性是荒谬的——确实是一场惨败!
- 如果您的程序执行大量基于流的I/O,那么这实际上只是一个问题。
- afaik有些人认为它是插入新行的"平台中立"方式,而不知道
是c中的新行,
->特定于平台的行终止符转换是由流处理的。
- 我们是在讨论提前优化吗?很高兴有一个简单易用的结束行thingy用于您的输出。尤其是如果您正在学习该语言,并且没有立即看到''将对输出做什么。在学会分析代码之后,您可以考虑其他选项!
- @博佩尔森:在我看来,更大的问题是,如果没有std::endl,那么人们会从一开始就学会使用'
',因为'
'比std::endl短(和endl一样),我会说它也很简单。:-]最后,std::endl只会给你带来更差的性能和更多的输入。
- @博佩尔森:我想另一种表达方式是,与使用'
'相比,std::endl的存在和普遍性是一种过早的混淆是一种过早的优化。
- 今天学到了一些新东西。谢谢您!
- @艾德加恩:除了性能差,打字和冲水,它什么也不买。我被它咬了一口,把跟踪添加到一个程序中,这个程序正在崩溃以检测何时/何地,并被混淆,因为除非您刷新,否则输出中没有消息并不意味着跟踪没有到达,它可能已经到达而没有刷新。
- @大卫:当然,如果你需要冲水的话,可以使用endl;但是大多数使用endl的人不需要冲水。