"cout"

2013-01-17 21 views
12

का उपयोग करते समय तारों को एक साथ रखने के लिए "<<" या "+" का उपयोग करके मैंने लोगों को "< <" और "+" दोनों का उपयोग करके अलग-अलग तारों को एक साथ आउटपुट देखा है।"cout"

cout << firstname << lastname << endl; 

बनाम:

cout << firstname + lastname << endl; 

इसका इस्तेमाल करने के लिए "< <" या यह नहीं बहुत अधिक अंतर पड़ता है बेहतर है?

+3

आप एक परीक्षण भी कर सकते हैं जो तेजी से और परिणाम पोस्ट कर सकता है। – Csq

+0

मुझे लगता है कि आप 'ऑपरेटर + 'concatenation के लिए' std :: string' का जिक्र कर रहे हैं? यह कच्चे 'कॉन्स char *' s के साथ काम नहीं करेगा। – 0x499602D2

उत्तर

15

निश्चित रूप से, << का उपयोग करें - स्ट्रिंग श्रृंखलाबद्ध एक साथ चिपकाया दो तार की एक प्रति का निर्माण करेगा। चाहे यह शीर्ष पर अतिरिक्त मेमोरी आवंटित करता है, यह बात है कि सी ++ लाइब्रेरी में तारों को कैसे कार्यान्वित किया जाता है, लेकिन यदि पहले और अंतिम नाम "लंबे समय तक पर्याप्त" (8-16 वर्णों से बड़े होते हैं), तो संभवतः यह स्मृति आवंटित करेगा (और फिर अस्थायी प्रतिलिपि की आवश्यकता नहीं होने पर इसे फिर से मुक्त करें)।

<< ऑपरेटर तुलना में बहुत कम भूमि के ऊपर होगा, तो इसमें कोई शक नहीं है कि यह बेहतर है।

बेशक

, जब तक आप इन बातों के हजारों करते हैं, यह संभावना नहीं है कि आप एक औसत दर्जे का अंतर होगा। लेकिन सीपीयू चक्रों को बर्बाद नहीं करना अच्छा है, आप कभी नहीं जानते कि वे कहीं और अच्छे उपयोग कर सकते हैं ...;)

+0

भी देखें: [समय से पहले pessimization] (http://books.google.co.uk/books?id=mmjVIC6WolgC&pg=PT90) – spencercw

19

मैं अपने बेहतर है कि विशेष मामले में << उपयोग करने के लिए कह सकते हैं कि। अन्यथा, एक अस्थायी में concatenation परिणाम जो किसी भी अच्छे कारण के लिए स्मृति आवंटित कर सकता है।

0

कैस्केडिंग << बेहतर विकल्प है।

प्रदर्शन के लिए

, के रूप में अन्य theads उल्लेख किया है, ऑपरेटर << जरूरी नहीं कि कोई अस्थायी वस्तु का परिचय नहीं है। एक कैस्केडिंग << को पाइप के रूप में माना जा सकता है।

कभी-कभी, यदि आप बाएं हाथ के ऑपरेंड उपयोगकर्ता द्वारा परिभाषित प्रकार नहीं हैं, तो आप प्रदान करते हैं, तो आप + का उपयोग नहीं कर सकते हैं। उदा।,

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

अंतिम पंक्ति से काम नहीं करने के लिए के लिए यह एक स्ट्रिंग प्रकार का एक बहुत गरीब कार्यान्वयन की आवश्यकता होगी। यह निश्चित रूप से 'std :: string' के साथ काम करेगा। –

+0

हां, std :: स्ट्रिंग में वह समर्थन है। –

+0

@ के-बॉलो: बिल्कुल लिखा गया है, आखिरी पंक्ति एक कॉन्स char [] है, और इस प्रकार यह + ऑपरेटर cout << std :: string ("हैलो,") + lastname << endl का समर्थन नहीं करता है; काम करेगा – deworde

संबंधित मुद्दे