2010-01-25 17 views
5

पर भरोसा करते हुए आप वापसी मूल्य अनुकूलन का उपयोग करने के बारे में कैसे जाते हैं?
क्या कोई ऐसा मामला है जहां मैं ऑप्टिमाइज़ेशन का उपयोग करने के लिए एक आधुनिक कंपाइलर पर भरोसा कर सकता हूं, या क्या मुझे हमेशा सुरक्षित तरीके से जाना चाहिए और किसी प्रकार के पॉइंटर को वापस करना चाहिए/पैरामीटर के रूप में संदर्भ का उपयोग करना चाहिए?रिटर्न वैल्यू ऑप्टिमाइज़ेशन

क्या कोई ज्ञात मामला है जहां रिटर्न वैल्यू ऑप्टिमाइज़ेशन नहीं बनाया जा सकता है ?, मुझे लगता है कि रिटर्न वैल्यू ऑप्टिमाइज़ेशन एक कंपाइलर के प्रदर्शन के लिए काफी आसान होगा।

+2

ध्यान रखें कि संकलक यह निर्धारित करने का निर्णय ले सकता है कि जब यह निर्धारित करता है कि आरवीओ वास्तव में किसी विशेष मामले में अनुकूलन नहीं है। इसलिए, आपको केवल उपयोगी होने पर इसे करने के लिए संकलक पर भरोसा नहीं करना पड़ता है, लेकिन आपको इसे अनुचित होने पर _not_ करने पर भी भरोसा करना पड़ता है। – MSalters

+0

स्पष्टीकरण के लिए: एक सामान्य मामला जिसमें यह अनुचित है, जब लौटाया गया प्रकार किसी रजिस्टर में पास किया जा सकता है, उदा। एक 'रेडियंस' वर्ग। आरवीओ तकनीक ढेर पर आवंटित स्थान का उपयोग करती है, और इस प्रकार स्मृति तक पहुंचने का ओवरहेड होता है। – MSalters

+0

@MSalters ठीक है, जानना दिलचस्प है। असल में, जिस अनुकूलन में मुझे रूचि है, वह उदाहरण के लिए एक std :: vector <> कॉपी करने के लिए टालना है। –

उत्तर

8

जब भी कंपाइलर अनुकूलन सक्षम होते हैं (और अधिकांश कंपाइलरों में, भले ही अनुकूलन अक्षम) हो, आरवीओ होगा। एनआरवीओ थोड़ा कम आम है, लेकिन कम से कम अनुकूलन सक्षम होने पर, अधिकांश कंपेलर भी इस अनुकूलन को निष्पादित करेंगे।

आप सही हैं, अनुकूलन एक कंपाइलर के प्रदर्शन के लिए काफी आसान है, यही कारण है कि संकलक लगभग हमेशा ऐसा करते हैं। एकमात्र ऐसे मामले जहां इसे "नहीं बनाया जा सकता" वे हैं जहां अनुकूलन लागू नहीं होता है: आरवीओ केवल तभी लागू होता है जब आप एक अस्थायी अस्थायी लौटाते हैं। यदि आप एक नामित स्थानीय चर वापस करना चाहते हैं, तो एनआरवीओ इसके बजाए लागू होता है, और जब यह एक कंपाइलर को कार्यान्वित करने के लिए थोड़ा अधिक जटिल होता है, तो यह करने योग्य है, और आधुनिक कंपेलरों को इसमें कोई समस्या नहीं है।

+0

विशेष रूप से, यदि आपके पास 2 नाम चर हैं और रनटाइम पर लौटने के लिए एक को उठाएं, जाहिर है कि संकलक एनआरवीओ नहीं कर सकता :) –

+0

मैथ्यूयू, मुझे लगता है कि यह दो अज्ञात निकासों के लिए जाता है? (यानी, "अगर (...) वापसी ए() और वापसी बी();" –

+0

@ विक्टर: नहीं - वह आरवीओ है, नहीं ** एन ** आरवीओ। उनमें से केवल एक ही बनाया जाएगा। तो दोनों कोड पथ उसी स्मृति का उपयोग कर सकते हैं, जो वापसी मूल्य के लिए आरक्षित स्मृति है। यह आरवीओ का सार है: इसके लिए आरक्षित स्मृति में सीधे वापसी मूल्य बनाएं। – MSalters

2

है कि यह तब होता है सबसे अच्छा मौका है के लिए, आप एक वस्तु वापसी बयान में सीधे निर्माण लौट सकते हैं [किसी को भी इस मुहावरे के लिए नाम याद कर सकते हैं - मैं इसे भूल गए]:

Foo f() { 
    .... 
    return Foo(...); 
} 

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

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