1

可能的重复:
C++
cin 或 printf 中的 printf vs cout??

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

PS 我知道这看起来类似于C++ 中的“printf”与“cout”,但我并不是真的在问同样的事情。

4

2 回答 2

7

简答

快点 :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的一系列测试显示了有趣的结果(我现在在我的计算机上复制了该结果),即:cout并且printf在避免使用时具有相似的性能std::endl(除了输出 a 之外还会刷新输出\n)。

于 2010-09-04T20:10:47.447 回答
3
  • 更快:printf
  • 更加类型安全和可扩展:cout
  • 更好:取决于!我printf更喜欢。

我不是唯一一个认为 C++ 的 cout 格式化的方式只是史诗般的失败。

于 2010-09-04T20:14:17.463 回答