【问题标题】:which is faster, and which is more flexible: printf or cout? [duplicate]哪个更快,哪个更灵活:printf 还是 cout? [复制]
【发布时间】:2011-04-08 07:32:11
【问题描述】:

可能的重复:
printf vs cout in C++
cin or printf??

我一直想知道 printf 和 cout.. 哪个最终更快,它是否也最灵活(即可以打印一系列变量,并且可以格式化输出)?

附: 我知道这看起来类似于 'printf' vs. 'cout' in C++ ,但我并不是真的问同样的事情。

【问题讨论】:

  • @Greg,您是否阅读了您所引用问题的答案(除了接受的答案,应该忽略)?那里有一些很好的信息,它似乎回答了你的问题。
  • @Michael Petrotta:你显然没有完全阅读我的问题,我不是问哪个更好。
  • “最终哪个更快”:分析您的应用并确定文本输出是瓶颈,然后再担心性能。为了促进这一点,您可以将打印包装到以后可以轻松重新实现的模块中。 “它也是最灵活的吗”我不知道您是否可以尽可能轻松地自定义 printf,尽管您最终可以使用其中任何一种打印任何东西。
  • @Greg, Michael:我同意迈克尔的观点。 答案涵盖了您正在寻找的信息,即使问题没有。

标签: c++ printf cout


【解决方案1】:

简答

更快:printf

更灵活:cout

长答案

与 sprintf 系列相比,C++ 流应该更慢(如果我记得 Herb Sutter 的 Exceptional C++ 项目的话,速度会慢 6 倍)。尽管如此,大多数情况下,您并不需要这种速度,但您需要确保您的代码不会出现错误。

使用 printf 系列函数很容易出错,可能是在代码中放置了错误数量的参数、错误的类型,甚至是引入了潜在的安全漏洞(想到了 %n 说明符)。

除非真的想要它(然后,它被称为破坏),否则 C++ 流几乎不可能出错。它们无缝地处理所有已知类型(内置、std::strings 等),并且很容易扩展它。例如,假设我有一个对象“Coordinate3D”,并且我想打印出它的数据:

#include <iostream>

struct Coordinate3D
{
    int x ;
    int y ;
    int z ;
} ;

std::ostream & operator << (std::ostream & p_stream
                          , const Coordinate3D & p_c)
{
    return p_stream << "{ x : " << p_c.x
                   << " , y : " << p_c.y
                   << " , z : " << p_c.z << " }" ;
}

int main(int argc, char * argv[])
{
    Coordinate3D A = {25,42,77} ;
    std::cout << A << std::endl ;
          // will print "{ x : 25 , y : 42 , z : 77 }"
    return 0 ;
}

流的问题在于,当想要指定某些数据的格式(例如,数字的填充空格)时,它们很难正确处理,而且有时,您真的需要快速处理。然后,要么回退到 printf,要么尝试一些高速 C++ 替代方案(想到FastFormat)。

编辑:注意Thomas'系列测试显示了有趣的结果(我现在在我的电脑上复制了),即:coutprintf有相似之处避免使用std::endl(除了输出\n之外,还会刷新输出)时的性能。

【讨论】:

  • Effective C++ 由 Scott Myers 编写。 Herb Sutter 编写了 Exceptional C++。是的,名字很相似……
  • @Whisty:对!我纠正了错误。谢谢!有两个系列的书...
【解决方案2】:
  • 更快:printf
  • 更多类型安全和可扩展:cout
  • 更好:取决于!我更喜欢printf

I'm not alone 认为 C++ 的 cout 进行格式化的方式只是史诗般的失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-02
    • 2013-09-15
    • 2014-05-16
    • 2011-03-26
    • 2012-06-12
    • 2010-09-29
    • 2011-03-14
    • 2012-07-15
    相关资源
    最近更新 更多