मूल्य से स्मार्ट संकेत लौटें।
जैसा कि आपने कहा है, यदि आप इसे संदर्भ द्वारा वापस करते हैं, तो आप संदर्भ गणना को ठीक से नहीं बढ़ाएंगे, जिससे अनुचित समय पर कुछ हटाने का जोखिम खुल जाता है। अकेले संदर्भ के द्वारा वापस नहीं जाने के लिए पर्याप्त कारण होना चाहिए। इंटरफेस मजबूत होना चाहिए।
मूल्य चिंता आजकल वैल्यू ऑप्टिमाइज़ेशन (आरवीओ) वापस करने के लिए धन्यवाद है , इसलिए आप वेतन वृद्धि-वृद्धि क्रम या आधुनिक कंपाइलरों में ऐसा कुछ नहीं करेंगे। तो वापसी के लिए सबसे अच्छा तरीका shared_ptr
है बस मूल्य द्वारा वापस जाना है:
shared_ptr<T> Foo()
{
return shared_ptr<T>(/* acquire something */);
};
यह आधुनिक C ++ कंपाइलर के लिए एक मृत-स्पष्ट RVO अवसर है। मुझे पता है कि विजुअल C ++ कंपाइलर RVO को तब भी लागू करते हैं, जब सभी अनुकूलन बंद हो जाते हैं। और C ++ 11 के चाल शब्दार्थ के साथ, यह चिंता और भी कम प्रासंगिक है। (लेकिन यह सुनिश्चित करने का एकमात्र तरीका प्रोफ़ाइल और प्रयोग है।)
यदि आप अभी भी आश्वस्त नहीं हैं, तो डेव अब्राहम के पास एक लेख है जो मूल्य द्वारा लौटने के लिए एक तर्क देता है। मैं यहां एक स्निपेट को पुन: पेश करता हूं; मैं अत्यधिक सलाह देता हूं कि आप पूरा लेख पढ़ें:
ईमानदार रहें: निम्नलिखित कोड आपको कैसा महसूस कराता है?
std::vector<std::string> get_names();
...
std::vector<std::string> const names = get_names();
सच कहूँ, भले ही मुझे बेहतर पता होना चाहिए, यह मुझे परेशान करता है। सिद्धांत रूप में, जब get_names()
रिटर्न मिलता है, तो हमें एक vector
की नकल करनी होती है string
। फिर, जब हम शुरू करते हैं names
, तो हमें इसे फिर से कॉपी करने की आवश्यकता होती है
, और हमें पहली प्रति को नष्ट करने की आवश्यकता होती है। यदि string
वेक्टर में N s हैं , तो प्रत्येक प्रतिलिपि को N + 1 मेमोरी आबंटन और कैश-अनफ़ेयर डेटा एक्सेस की एक पूरी श्रृंखला की आवश्यकता हो सकती है> जैसा कि स्ट्रिंग सामग्री की प्रतिलिपि बनाई गई है।
इस तरह की चिंता का सामना करने के बजाय, मैं अक्सर अनावश्यक प्रतियों से बचने के लिए पास-बाय-संदर्भ पर वापस गिर गया हूं:
get_names(std::vector<std::string>& out_param );
...
std::vector<std::string> names;
get_names( names );
दुर्भाग्य से, यह दृष्टिकोण आदर्श से बहुत दूर है।
- कोड में 150% की वृद्धि हुई
- हमें छोड़ना पड़ा है
const
क्योंकि हम नाम बदल रहे हैं।
- जैसा कि कार्यात्मक प्रोग्रामर हमें याद दिलाना पसंद करते हैं, म्यूटेशन कोड को रेफ़रेंशियल ट्रांसपेरेंसी और इक्विशनल रीज़निंग को कम करके कारण को और अधिक जटिल बनाता है।
- अब हमारे पास नामों के लिए सख्त मूल्य शब्दार्थ नहीं हैं।
लेकिन क्या दक्षता हासिल करने के लिए इस तरह से हमारे कोड को गड़बड़ाना वास्तव में आवश्यक है? सौभाग्य से, जवाब नहीं निकला (और विशेष रूप से अगर आप C ++ 0x का उपयोग कर रहे हैं) नहीं।