2013-01-17 28 views
12

我看到人們通過同時使用「< <」和「+」輸出不同的字符串。使用「<<」或「+」在使用「cout」時將字符串放在一起

cout << firstname << lastname << endl; 

與:

cout << firstname + lastname << endl; 

是它更好地使用 「< <」 或者它沒有多大的差別?

+3

你也可以做一個更快的測試併發布結果。 – Csq

+0

我假設你指的'操作符+'連接'std :: string'?這不適用於原始的'const char *'s。 – 0x499602D2

回答

15

當然,使用<< - 連接字符串將創建粘貼在一起的兩個字符串的副本。它是否也在頂層分配額外的內存是一個關於如何在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

相關問題