2008-09-18 25 views
7

मान लीजिए मैं निम्नलिखित कोड है:क्या डिफ़ॉल्ट निर्मित मूल्यों को वापस करने में कुछ गड़बड़ है?

class some_class{}; 

some_class some_function() 
{ 
    return some_class(); 
} 

यह बहुत अच्छी तरह से काम करने के लिए लगता है और मुझे सिर्फ एक वापसी मान बनाने के लिए एक चर घोषित करने की मेहनत बचाता है। लेकिन मुझे नहीं लगता कि मैंने कभी इसे किसी भी प्रकार के ट्यूटोरियल या संदर्भ में देखा है। क्या यह एक कंपाइलर-विशिष्ट चीज है (दृश्य सी ++)? या यह कुछ गलत कर रहा है?

उत्तर

16

नहीं यह बिल्कुल मान्य है। यह भी अधिक कुशल होगा क्योंकि संकलक वास्तव में अस्थायी को अनुकूलित करने में सक्षम है।

+0

असल में, आधुनिक कंपाइलर अक्सर नामित चर को दूर करने में सक्षम होते हैं जो –

1

यह पूरी तरह से कानूनी सी ++ है और किसी भी कंपाइलर को इसे स्वीकार करना चाहिए। आपको क्या लगता है कि यह कुछ गलत कर रहा है?

+0

लौटाता है यह सिर्फ इतना है कि मैंने कभी भी इसे कभी भी सी ++ के साथ अपने सीमित अनुभव में कहीं भी नहीं देखा है। –

+0

पर्याप्त मेला। अस्थायी चर का उपयोग करने का कोई कारण नहीं है, तो निश्चित रूप से इसका उपयोग करें, तो आपको यह नहीं करना है! –

5

फ़ंक्शन कॉल से लौटने वाली ऑब्जेक्ट्स "फैक्टरी" डिज़ाइन पैटर्न है, और इसका व्यापक रूप से उपयोग किया जाता है।

हालांकि, आप सावधान रहना चाहेंगे कि आप ऑब्जेक्ट्स, या ऑब्जेक्ट्स को पॉइंटर्स लौटते हैं या नहीं। इनमें से पूर्व आपको कन्स्ट्रक्टर/असाइनमेंट ऑपरेटरों की प्रतिलिपि बनाने के लिए पेश करेगा, जो दर्द हो सकता है।

2

यह मान्य है, लेकिन प्रदर्शन कैसे कहा जाता है इसके आधार पर आदर्श आदर्श नहीं हो सकता है।

उदाहरण के लिए:

A a; 
a = fn(); 

और

A a = fn(); 

ही नहीं हैं।

पहले मामले में डिफ़ॉल्ट कन्स्ट्रक्टर कहा जाता है, और फिर असाइनमेंट ऑपरेटर को उस पर लागू किया जाता है जिसके लिए एक अस्थायी चर बनाने की आवश्यकता होती है।

दूसरे मामले में कॉपी कन्स्ट्रक्टर का उपयोग किया जाता है।

एक बुद्धिमान पर्याप्त संकलक काम करेगा कि अनुकूलन क्या संभव है। लेकिन, यदि कॉपी कन्स्ट्रक्टर उपयोगकर्ता द्वारा आपूर्ति की जाती है तो मुझे नहीं लगता कि कंपाइलर अस्थायी चर को कैसे अनुकूलित कर सकता है। इसे कॉपी कन्स्ट्रक्टर का आह्वान करना है, और ऐसा करने के लिए इसे एक और उदाहरण होना है।

+1

मानक स्पष्ट रूप से संकलक को कॉपी कन्स्ट्रक्टर को जोड़ने की अनुमति देता है। –

1

यदि आपकी कक्षा बहुत हल्का है तो यह करने का सबसे अच्छा तरीका है - मेरा मतलब है कि इसकी प्रतिलिपि बनाना बहुत महंगा नहीं है।

उस विधि का एक दुष्प्रभाव हालांकि यह है कि यह अस्थायी वस्तुओं को बनाने की अधिक संभावना बनाता है, हालांकि यह इस बात पर निर्भर करता है कि संकलक चीजों को अनुकूलित कैसे कर सकता है।

अधिक हेवीवेट कक्षाओं के लिए जिन्हें आप सुनिश्चित करना चाहते हैं, कॉपी नहीं किए गए हैं (उदाहरण के लिए एक बड़ी बिटमैप छवि) कहें तो फिर एक संदर्भ पैरामीटर के रूप में सामान को पास करना एक अच्छा विचार है जो तब भर जाता है, बस पूरी तरह से सुनिश्चित करें कि कोई अस्थायी वस्तुएं नहीं बनाई जाएंगी।

कुल मिलाकर यह हो सकता है कि सिंटैक्स को सरल बनाना और चीजों को और अधिक सीधे बनाने के लिए अभिव्यक्तियों में अधिक अस्थायी वस्तुओं को बनाने का दुष्प्रभाव हो, केवल कुछ हेवीवेट ऑब्जेक्ट्स के लिए इंटरफेस को डिज़ाइन करते समय आपको ध्यान में रखना चाहिए।

2

रोब वॉकर के उदाहरण के बीच अंतर को रिटर्न वैल्यू ऑप्टिमाइज़ेशन (आरवीओ) कहा जाता है यदि आप इसके लिए Google करना चाहते हैं।

संयोग से, यदि आप यह सुनिश्चित करना चाहते हैं कि आपकी वस्तु को सबसे कुशल तरीके से वापस कर दिया जाए, तो साझा_ptr का उपयोग करके वस्तु को ढेर (यानी नए के माध्यम से) बनाएं और बदले में एक साझा_ptr वापस करें। सूचक वापस आ जाता है और संदर्भ सही मायने रखता है।

+1

आम तौर पर, आरवीओ share_ptr का उपयोग करने से अधिक कुशल है, वस्तु ढेर पर जगह बनाई जाती है। साथ ही, shared_ptr को गिनती को स्टोर करने के लिए एक अतिरिक्त ऑब्जेक्ट बनाना है। –

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

  • कोई संबंधित समस्या नहीं^_^