【问题标题】:What is the C++ iostream endl fiasco?什么是 C++ iostream endl 惨败?
【发布时间】:2011-07-26 10:19:06
【问题描述】:

我正在听google talk by Andrei Alexandrescu on the D programming 的语言,当时他发表了一篇关于“endl”惨败的单字。我只是认为 endl 是表示行尾并刷新流缓冲区的首选方式。为什么它被认为是惨败?我不应该在我的代码中使用它吗?

【问题讨论】:

  • @ildjarn:你是 100% 正确的。我知道它会刷新缓冲区,但在 CEOI 2008 中仍然损失了大约 75 分!坏习惯!
  • @ildjarn 我的老师坚持我们使用std::endl 而不是\n,我同意这很奇怪。但话又说回来,我们只是在编写简单的控制台程序。但话又说回来,他似乎认为在循环中初始化(POD)变量是一个潜在的性能问题......
  • 我添加了链接,我也在erdani.com找到了链接
  • @Tod Thats Alexandrescus 主页 :)

标签: c++ iostream endl


【解决方案1】:

(我假设)他的意思是许多,尤其是新的 C++ 程序员盲目地使用 std::endl 而不是 '\n' 作为换行符,不必要地频繁刷新并可能使他们的程序的性能很糟糕。

即,大多数人都被告知std::endl 是向流中插入换行符的规范方式,即使它很少需要或不适合刷新它.

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


TL;DR(s)

  • 到最后,std::endl 除了通常更差的性能和通常更多打字之外,什么都给你。
  • 它有它的用途,但它们比它在大多数大型代码库中的使用频率所暗示的要少得多,因此...
  • 它的实用性非常值得怀疑,它的普遍存在是荒谬的——真是一场惨败!

【讨论】:

  • AFAIK 有些人使用它,认为这是插入换行符的“平台中立”方式,却不知道 \n C 中的换行符,而 @987654328 @->平台特定的行终止符转换由流处理。
  • 我们在这里谈论的是过早优化吗?很高兴有一个简单易用的终端线用于您的输出。特别是如果您正在学习语言并且没有立即看到 '\n' 会对输出做什么。在你学会了分析你的代码之后,你可以考虑其他的选择!
  • @Bo Persson:更大的问题(在我看来)是,如果没有std::endl,那么人们将从一开始就被教导使用'\n',而'\n' 是键入比std::endl 更短(与endl 相同)我会说它也很容易使用。 :-] 最后,std::endl 给你带来的只是更差的性能和更多的打字。
  • @Bo Persson :我想另一种说法是,std::endl 的存在和普遍存在是一种过早的悲观化,而不是使用'\n' 是一种过早的优化。
  • @ildjarn:除了更差的性能、更多的输入 刷新之外,它什么也没给你。我被它咬住了,向一个崩溃的程序添加跟踪以检测何时/何地并且感到困惑,因为除非你刷新,否则输出中没有消息并不意味着没有达到跟踪,它可能已经达到并且没有冲洗。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 2010-11-03
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2018-05-07
相关资源
最近更新 更多