हां, इस स्थिति का उपयोग करने से उस स्थिति में कोई नुकसान नहीं होता है। सभी कॉपी करने योग्य ऑब्जेक्ट्स स्वचालित रूप से चलने योग्य होते हैं, इसलिए इससे कोई फर्क नहीं पड़ता। वास्तव में, कुछ हमेशा संभव होने पर भी चर को स्थानांतरित करने की सलाह देते हैं।
एक विकल्प के रूप में, आप सही अग्रेषण का उपयोग करने, this answer में वर्णित के रूप में विचार कर सकते:
template <typename T2>
foo(T2&& t) : m_t(std::forward<T2>(t)) {}
आप जानते हैं कि T
एक तेजी से कदम निर्माता को परिभाषित करता है, तो इससे कोई फर्क नहीं करना चाहिए। अन्यथा, अनावश्यक प्रतियों से बचने के लिए एक निर्माता foo(const T&)
प्रदान करने की अनुशंसा की जाती है।
बिल्कुल सही अग्रेषण यह प्राप्त करने के लिए केवल एक तकनीक है। कन्स्ट्रक्टर foo(const T&)
और foo(T&&)
लिखने के लिए पब्बी का समाधान निश्चित रूप से भी ठीक है। परिणाम समान हैं, यह ज्यादातर शैली का मामला है।
आपने छोटे पूर्णांक प्रकारों के बारे में भी पूछा। सिद्धांत रूप में, संदर्भ द्वारा उन्हें पास करना उन्हें कॉपी करने से धीमा है, लेकिन संकलक इसे किसी प्रतिलिपि में अनुकूलित करने में सक्षम होना चाहिए, वैसे भी। मुझे नहीं लगता कि इससे कोई फर्क पड़ेगा।
तो, सबसे बुरी स्थिति के लिए बेहतर अनुकूलन करें जहां T
विशाल हो सकता है और तेजी से चलने वाला कन्स्ट्रक्टर प्रदान नहीं करता है। संदर्भ द्वारा पास करना उस स्थिति के लिए सबसे अच्छा है और सामान्य रूप से खराब विकल्प नहीं होना चाहिए।
स्रोत
2013-06-10 23:19:49
क्या आपका संदर्भ तरीका मेरे से बेहतर है? यदि टी निर्माण योग्य नहीं है तो यह (या होना चाहिए) निहित है कि टी छोटा/सामान्य (बड़ा नहीं) है, है ना? इस मामले में क्या आपको लगता है कि एक संदर्भ मुझे किसी भी मापनीय प्रदर्शन लाभ देता है? – 7cows
@ 7cows यह एक मापनीय प्रदर्शन लाभ दे सकता है जब टी में एक महंगी प्रतिलिपि निर्माता और कोई चालक कन्स्ट्रक्टर नहीं है, जो सी ++ 03 पुस्तकालयों के साथ आम है। मैं आमतौर पर आमतौर पर अपना रास्ता पसंद करते हैं। – Pubby