2013-01-20 16 views
6

मान लीजिए कि मैं समारोह करते हैंक्या सी ++ कंपाइलर एक कॉन्स रिटर्न वैल्यू के लिए आरवीओ कर सकता है?

#include <string> 

std::string const foo() 
{ 
    std::string s = "bar"; 
    return s; 
} 

int main() 
{ 
    std::string t = foo(); 
} 

कर सकते हैं एक संकलक t के लिए अनुकूलन, const प्रदर्शन (नाम) वापसी-मूल्य भले ही s और t के प्रकार foo की वापसी प्रकार से दोनों अलग हैं कारण -एकता अंतर?

(उत्तर के लिए सी ++ 03 और भिन्न है, तो सी ++ 11 तो मैं निश्चित रूप से सी ++ 03 जवाब जानने में दिलचस्पी रहा हूँ।)

+0

आप अपने प्रयोगों के परिणामों को कम से कम एक कंपाइलर के साथ क्यों शामिल नहीं करते? –

+0

@MarcGlisse: ठीक है, विजुअल सी ++ 2008 ने इसे अनुकूलित किया है, लेकिन मुझे यकीन नहीं है कि मानक वास्तव में इसे अनुमति देता है या नहीं। – Mehrdad

उत्तर

7

RVO अनुकूलन तोड़ने के लिए कोई तरीका नहीं है const का वादा, इसलिए कोई समस्या नहीं है: आरवीओ किया जा सकता है।


हालांकि, चाल अर्थ विज्ञानconst से प्रभावित है। यह प्रभावी ढंग से चाल semantics अक्षम करता है, यानी T(T&&) कन्स्ट्रक्टर या असाइनमेंट ऑपरेटर ले जाएँ। तो सामान्य रूप से, वापसी मूल्य पर const का उपयोग न करें।

स्कॉट मेयर्स ने मूल रूप से अधिक मूल्य कोडिंग के लिए const की वापसी मूल्यों पर अनुशंसा की।

फिर आंद्रेई अलेक्जेंड्रेस्कू, डीडीजे के लिए उनके मोजो लेख में, ध्यान दिया गया कि अब से आगे बढ़ने के साथ, const वापसी मूल्यों पर बेहतर प्रतिबंध लगाया जाना चाहिए, और स्कॉट की पूर्व सलाह को अनदेखा किया जाना चाहिए।


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

तो, अगर मेरी शब्दावली गलत है और मुझे वास्तव में कुछ अन्य परिवर्णी शब्द का उपयोग करना चाहिए, तो कृपया सही करने के लिए स्वतंत्र महसूस करें! :-)

+0

+1 स्थानांतरण अर्थशास्त्र के बारे में अच्छा बिंदु, हालांकि यह मुझे आश्चर्यचकित करता है: तो एक कॉन्स रिटर्न वैल्यू के साथ चाल semantics अक्षम करने में क्या गलत है? आरवीओ नहीं है (जो पूरी तरह से किसी ऑब्जेक्ट को तत्काल करने से बचाता है) अभी भी स्थानांतरित करने से बेहतर है (जिसे वास्तविक वस्तु को करने के लिए अभी भी ऑब्जेक्ट को चालू करने और रखरखाव कार्य करने की आवश्यकता है)? – Mehrdad

+0

@ मेहरदैड: ले जाएं अर्थशास्त्र प्रोग्रामर नियंत्रण में है, और कंपाइलर में इसमें कोई बात नहीं है, जबकि आरवीओ कंपाइलर नियंत्रण में है, और प्रोग्रामर में लगभग कोई बात नहीं है। उदाहरण के लिए, कॉल प्रारंभिक के बजाय असाइनमेंट 's = foo()' हो सकता है। फिर 'const' फ़ंक्शन स्ट्रिंग परिणाम के बफर को स्थानांतरित करने से रोकता है: संभवतः अभी तक एक और बफर आवंटित किया गया है, इसकी अधिकतर प्रतिलिपि बनाई जाएगी। –

+0

ठीक है, लेकिन * अगर * मुझे पता है कि आरवीओ हो रहा है, तो यह * कभी * (अभ्यास में) एक चाल से धीमा नहीं होगा, है ना? तो प्रदर्शन के अनुसार, यदि आप आरवीओ सुनिश्चित कर सकते हैं, तो 'कॉन्स्ट' लौटने से उत्परिवर्तनीय लौटने से बेहतर है? – Mehrdad

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

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