【问题标题】:Why some examples are using "endl" instead of "\n"? [duplicate]为什么有些例子使用“endl”而不是“\n”? [复制]
【发布时间】:2021-03-22 18:40:34
【问题描述】:

为什么有些示例使用“endl”而不是“\n”?

听说“endl”的处理时间比“\n”长,因为“endl”有一些flush过程。

但是,网上有很多使用“endl”的例子。

我想知道他们为什么使用被认为效率低下的“endl”。

对不起,英语不好......谢谢

【问题讨论】:

  • 使用std::endl 可能有兴趣在调试时!在程序冲突之前查看屏幕上写的内容
  • Source 发送后也会调用flush() \n
  • 因为在 99.9% 的情况下,您都想要冲洗并且性能令人满意。几年前,这是一种流行的微优化,即使在那些认为过早优化是万恶之源的人中也是如此。
  • 它也更冗长,对于新手来说可能更容易理解? endl 作为 end line 的快捷方式比一些魔术符号 '\n' 更明显。当然,你甚至不会注意到只有 20 行代码的玩具程序有什么不同..
  • std::endl 刷新输出流。如果您使用\n,它只会被缓冲,您可能不会在屏幕上看到新行。 std::endl 的唯一问题是性能。

标签: c++ endl


【解决方案1】:

通常,直接使用std::cout 并不适用于生产代码,通常首选使用某种日志记录工具(用于写入文件而不是标准流等)。在这样的日志库中,您需要注意只在需要时刷新,但对于一些临时的、类似调试的输出,std::endl 的性能影响并不重要,更重要的是立即看到所需的输出。

【讨论】:

  • “更重要的是立即看到所需的输出” - 并确保在婴儿车崩溃之前打印所有输出。
【解决方案2】:
  1. 许多人认为<< std::endl<< '\n' << std::flush 不同,因为它会插入正确的结束行标记。
    那是obviously nonsense

  2. 别人不明白std::cinstd::couttied together,所以前者想读时后者被刷新。

  3. 还有一些人从未听说过std::cerr,因此将日志错误定向到std::cout
    如果您使用了错误的工具,那么就让它随心所欲地表现,而不是退后一步并认识到您需要一把锤子而不是螺丝刀,这是令人痛苦的普遍现象。

  4. 如果你真的想要,可能是因为你的程序特别不稳定,而且你正在通过反复试验进行编程(这使得你的代码实际上不太可能是正确的,而不仅仅是 似乎“工作”最后),您可以轻松make std::cout unbuffered too
    无需再养成更坏的习惯。

     std::cout << std::unitbuf;
    

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2015-03-08
    相关资源
    最近更新 更多