什么是C++ iostream endl惨败?

Tod*_*Tod 52 c++ iostream endl

我正在听Andrei Alexandrescu关于D编程语言的谷歌谈话,当时他抛出一个关于"endl"惨败的内线.我只是认为endl是表示行结束并刷新流缓冲区的首选方式.为什么它被视为惨败?我不应该在我的代码中使用它吗?

ild*_*arn 74

转发自我的评论:

(我假设)他只是意味着许多(特别是新的)C++程序员std::endl盲目地使用而不是'\n'换行,不必要地频繁刷新并且可能使他们的程序性能变得糟糕.

即,大多数人被教导这std::endl是将新行插入流中规范方式,即使很少需要或适当地刷新它.

一些人的意见(*咳嗽*)std::endl甚至不应该在标准中,因为它很少适合,而且无论如何都不会显着节省打字'\n' << std::flush.


TL; DR(s):

  • 最后,std::endl除了通常更差的性能和通常更多的打字之外,什么都不买.
  • 它有它的用途,但它们比大多数大型代码库中的使用频率要少得多,因此...
  • 它的实用性是非常值得怀疑的,它的无处不在是荒谬的 - 确实是一场惨败!

  • AFAIK有些人使用它认为它是插入换行符的"平台中立"方式,而不知道`\n`**是**C中的换行符,并且`\n`->平台特定的行终止符转换是由流处理. (46认同)
  • @Bo Persson:更大的问题(在我看来)是如果没有`std :: endl`,那么人们将被教导从头开始使用''\n'`,并作为''\n'`是短的键入然后`std :: endl`(和`endl`相同)我会说它也很简单.: - ]最后,`std :: endl`除了性能更差,通常更多打字之外什么都不买. (10认同)
  • @Bo Persson:我想另一种表达方式是,'std :: endl`的存在和普遍存在是一种过早的悲观化 - 所以比使用''\n'`是一种过早的优化. (10认同)
  • 我们在这里谈论过早的优化吗?很高兴有一个简单易用的终端东西用于您的输出.特别是如果你正在学习这门语言并且没有立即看到'\n'会对输出做什么.在学会了对代码进行概要分析后,您可以考虑其他选项! (6认同)
  • @ildjarn:除了性能更差,打字更多*和*刷新之外,它什么也买不到.我被它咬了一下,为程序添加了一些程序,这些程序崩溃以检测何时/何地并且被混淆,因为除非你刷新,否则输出中没有消息并不意味着没有达到跟踪,它可能已经到达并没有脸红. (5认同)
  • @David:当然,如果你需要冲洗,请使用`endl`; 但是,大多数使用`endl`的人都不需要冲洗. (3认同)
  • 如果您的程序执行大量基于流的I/O,那么这只是一个真正的问题. (2认同)
  • 今天学到了新的东西.谢谢! (2认同)