आपको मूल्य से लौटना चाहिए।
मान द्वारा लौटने की दक्षता में सुधार करने के लिए मानक में एक विशिष्ट विशेषता है। इसे "कॉपी एलीशन" कहा जाता है, और विशेष रूप से इस मामले में "नाम वापसी मूल्य अनुकूलन (NRVO)"।
कंपाइलर्स को इसे लागू करने की जरूरत नहीं है, लेकिन फिर कंपाइलरों के पास नहीं है कंपाइलरों को फ़ंक्शन इनलाइनिंग (या किसी भी अनुकूलन को पूरा करने) को लागू करने की । लेकिन मानक पुस्तकालयों का प्रदर्शन बहुत खराब हो सकता है यदि कंपाइलर अनुकूलन नहीं करते हैं, और सभी गंभीर कंपाइलर इनलाइनिंग और एनआरवीओ (और अन्य अनुकूलन) को लागू करते हैं।
जब NRVO लागू किया जाता है, तो निम्नलिखित कोड में कोई प्रतिलिपि नहीं होगी:
std::vector<int> f() {
std::vector<int> result;
... populate the vector ...
return result;
}
std::vector<int> myvec = f();
लेकिन उपयोगकर्ता ऐसा करना चाह सकता है:
std::vector<int> myvec;
... some time later ...
myvec = f();
कॉपी एलिसेंस यहां कॉपी को रोक नहीं सकता क्योंकि यह इनिशियलाइजेशन के बजाय असाइनमेंट है। हालाँकि, आपको चाहिए अभी भी मूल्य से वापस । सी ++ 11 में, असाइनमेंट को कुछ अलग से अनुकूलित किया जाता है, जिसे "मूव शब्दार्थ" कहा जाता है। C ++ 03 में, उपरोक्त कोड एक कॉपी का कारण बनता है, और हालांकि सिद्धांत में एक अनुकूलक इससे बचने में सक्षम हो सकता है, व्यवहार में यह बहुत मुश्किल है। तो इसके बजाय myvec = f()
, C ++ 03 में आपको यह लिखना चाहिए:
std::vector<int> myvec;
... some time later ...
f().swap(myvec);
एक और विकल्प है, जो उपयोगकर्ता को अधिक लचीला इंटरफ़ेस प्रदान करना है:
template <typename OutputIterator> void f(OutputIterator it) {
... write elements to the iterator like this ...
*it++ = 0;
*it++ = 1;
}
आप उसके बाद मौजूदा वेक्टर-आधारित इंटरफ़ेस का भी समर्थन कर सकते हैं:
std::vector<int> f() {
std::vector<int> result;
f(std::back_inserter(result));
return result;
}
यह आपके मौजूदा कोड की तुलना में कम कुशल हो सकता है, अगर आपका मौजूदा कोड reserve()
एक निश्चित राशि से अधिक जटिल तरीके से उपयोग करता है। लेकिन अगर आपका मौजूदा कोड मूल रूप push_back
से वेक्टर पर बार-बार कॉल करता है, तो यह टेम्पलेट-आधारित कोड उतना ही अच्छा होना चाहिए।
f
?