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

मान लीजिए मेरे पास निम्न कोड है:

class some_class{};

some_class some_function()
{
    return some_class();
}

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

0

6 उत्तर

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

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

A a;
a = fn();

तथा

A a = fn();

वह सामान नहीं है।

In the first case the default constructor is called, तथाthen the assignment operator is invoked on a which requires a temporary variable to be constructed.

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

An intelligent enough compiler will work out what optimizations are possible. But, if the copy constructor is user supplied then I don't see how the compiler can optimize out the temporary variable. It has to invoke the copy constructor, तथाto do that it has to have another instance.

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

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

0
जोड़ा
वास्तव में, आधुनिक कंपाइलर अक्सर नामित चर को दूर करने में सक्षम होते हैं जो वापस आ जाता है
जोड़ा लेखक Nemanja Trifunovic, स्रोत

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

0
जोड़ा
यह सिर्फ इतना है कि मैंने कभी देखा नहीं है कि यह सी ++ के साथ मेरे सीमित अनुभव में कहीं भी इस्तेमाल किया गया है।
जोड़ा लेखक Jason Baker, स्रोत
काफी उचित। अस्थायी चर का उपयोग करने का कोई कारण नहीं है, तो निश्चित रूप से इसका उपयोग करें, तो आपको यह नहीं करना है!
जोड़ा लेखक Greg Hewgill, स्रोत

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

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

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

यह पूरी तरह से उचित सी ++ है।

0
जोड़ा

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

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

0
जोड़ा