2013-01-17 21 views
12

"< <"と "+"の両方を使用して異なる文字列を出力することがあります。対"cout"を使用するときに "<<"または "+"を使用して文字列をまとめる

cout << firstname << lastname << endl; 

cout << firstname + lastname << endl; 

それは "< <" か、それは大きな違いがありませんを使用することをお勧めしますか?

+3

さらに高速なテストを行い、結果を投稿することもできます。 – Csq

+0

'operator +'連結のために 'std :: string'を参照していると仮定していますか?これは、生の 'const char *'では機能しません。 – 0x499602D2

答えて

15

間違いなく<<を使用してください。文字列を連結すると、貼り付けられた2つの文字列のコピーが作成されます。余分なメモリを割り当てるかどうかは、文字列がC++ライブラリにどのように実装されているかという問題ですが、最初と最後の文字が「十分に長い」(一緒に8-16文字より大きい)場合は、メモリを割り当てます(一時コピーが不要になったらもう一度解放してください)。

オペレータは比較でオーバーヘッドがほとんどありませんので、間違いなく良いでしょう。

もちろん、あなたが何千ものことをしない限り、測定可能な違いはありません。しかし、CPUサイクルを無駄にするのは良いことではありませんが、他のどこにあるかはわかりません...;)

+0

も参照してください:[時期尚早な悲観化](http://books.google.co.uk/books?id=mmjVIC6WolgC&pg=PT90) – spencercw

19

この特定のケースでは<<を使用する方が良いと言います。さもなければ、連結はの正当な理由のためにメモリを割り当てることができた一時的な結果をもたらします。

0

カスケード<<が良い選択です。

上記以外のパフォーマンスのために、オペレータ<<は、必ずしも一時的なオブジェクトを導入するとは限りません。カスケード接続はパイプと見なすことができます。

対応するoperator+を指定しない限り、左側オペランドがユーザー定義型でない場合は、+も使用できません。例:

cout << "Hello, " << lastname << endl;// Works 
cout << "Hello, " + lastname << endl; // This won't work 
+2

最後の行が機能しないようにするには、実際には文字列型の実装が貧弱です。これは確かに 'std :: string'で動作します。 –

+0

はい、std :: stringにはそのサポートがあります。 –

+0

@ K-ballo:まさしく書かれているように、最後の行はconst char []なので+演算子をサポートしていません cout << std :: string( "Hello")+ lastname << endl;うまくいく – deworde

関連する問題