1

重複の可能性: C++ cinまたはprintf
でのprintfとcout ??

私はいつもprintfとcoutについて疑問に思っていました。どちらが最終的に高速で、最も柔軟性がありますか(つまり、さまざまな変数を印刷でき、出力をフォーマットできます)?

PSこれはC++の「printf」と「cout」に似ていることは知っていますが、実際には同じことを求めているわけではありません。

4

2 に答える 2

7

短い答え

もっと早く :printf

より柔軟:cout

長い答え

sprintfファミリと比較すると、C ++ストリームは遅いと思われます(HerbSutterによるExceptionalC ++のアイテムを思い出すと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が思い浮かびます)。

編集:トーマスの一連のテストは興味深い結果を示していることに注意してください(これは今私のコンピューターで再現しました)。つまり、cout使用printfstd::endlを避けた場合(出力に加えて出力をフラッシュする)でも同様のパフォーマンスが得\nられます。

于 2010-09-04T20:10:47.447 に答える
3
  • より高速:printf
  • よりタイプセーフで拡張可能:cout
  • より良い:依存します!私はもっ​​と好きprintfです。

C ++のcoutがフォーマットを行う方法は、単なる壮大な失敗だと思っているのは私だけではありません。

于 2010-09-04T20:14:17.463 に答える