2013-01-17 72 views
12

Widziałem ludzi wyprowadzających różne ciągi razem, używając zarówno "< <" i "+".Używanie "<<" lub "+" do stawiania ciągów znaków podczas używania "cout"

cout << firstname << lastname << endl; 

kontra:

cout << firstname + lastname << endl; 

Czy lepiej jest użyć "< <" czy też nie robić wielkiej różnicy?

+3

Można również wykonać test, który jest szybszy i opublikować wyniki. – Csq

+0

Zakładam, że odsyłasz 'std :: string' do' operatora + 'konkatenacji? To nie zadziała z surowymi 'const char *' s. – 0x499602D2

Odpowiedz

15

Zdecydowanie, użyj << - łączenie łańcucha spowoduje utworzenie kopii dwóch połączonych ze sobą ciągów. Niezależnie od tego, czy przydzielana jest dodatkowa pamięć, to w jaki sposób łańcuchy są zaimplementowane w bibliotece C++, ale jeśli imiona i nazwiska są "wystarczająco długie" (razem więcej niż 8-16 znaków), to najprawdopodobniej przydzieli pamięć (a następnie zwolnij ponownie, gdy tymczasowa kopia nie jest już potrzebna).

W porównaniu z operatorem << w porównaniu z nim będzie niewiele, więc bez wątpienia lepiej.

Oczywiście, chyba że wykonasz tysiące takich rzeczy, jest mało prawdopodobne, że będziesz mieć wymierną różnicę. Ale dobrze jest nie marnować cykli procesora, nigdy nie wiesz, jaki dobry użytek może być gdzie indziej ...;)

+0

Zobacz też: [przedwczesna pesymizacja] (http://books.google.co.uk/books?id=mmjVIC6WolgC&pg=PT90) – spencercw

19

Powiedziałbym, że lepiej użyć << w tym konkretnym przypadku. W przeciwnym razie konkatenacja powoduje tymczasowe przydzielenie pamięci bez uzasadnionej przyczyny.

0

Kaskadowe << to lepszy wybór.

W celu uzyskania wydajności, jak wspomniane są inne wspomniane cykle, operator << niekoniecznie wprowadza dowolny obiekt tymczasowy. Kaskadowy << może być traktowany jako rura.

Czasami nie można użyć +, jeśli lewy operand nie jest typem zdefiniowanym przez użytkownika, chyba że podasz odpowiadający operator+. Np.,

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

Aby ostatnia linia nie działała, wymagałaby naprawdę słabej implementacji typu łańcucha. Na pewno zadziała z 'std :: string'. –

+0

Tak, std :: string ma to wsparcie. –

+0

@ K-ballo: Dokładnie tak jak napisano, ostatnia linia jest const char [], a zatem nie obsługuje operatora + cout << std :: string ("Hello") + nazwisko << endl; pracowałbym – deworde

Powiązane problemy