2012-05-09 6 views
6

ले जाएं semantics उपयोगी हो सकता है जब संकलक RVO और NRVO का उपयोग नहीं कर सकता है। लेकिन किस मामले में कंपाइलर इन सुविधाओं का उपयोग नहीं कर सकता?जब कोई कंपाइलर आरवीओ या एनआरवीओ का उपयोग नहीं कर सकता है?

+0

चेक इस सवाल: [सी ++: "लौटने" बयान के साथ प्रतिलिपि बचना] (http://stackoverflow.com/questions/10476665/c-avoiding-copy-with-the- वापसी-बयान) :) – LihO

उत्तर

5

उत्तर यह है कि यह संकलक और स्थिति निर्भर है। जैसे नियंत्रण प्रवाह शाखाकरण अनुकूलकों को भ्रमित कर सकता है। Wikipedia इस उदाहरण दे:

#include <string> 
std::string f(bool cond = false) { 
    std::string first("first"); 
    std::string second("second"); 
    // the function may return one of two named objects 
    // depending on its argument. RVO might not be applied 
    return cond ? first : second; 
} 

int main() { 
    std::string result = f(); 
} 
3

ठीक है, यह इतना नहीं है कि संकलक आरवीओ का उपयोग कर सकता है, लेकिन क्या यह एक प्रति निर्माण निर्माण से बच सकता है।

पर विचार करें:

struct Blah 
{ 
    int x; 
    Blah(int const _x): x(_x) { cout << "Hum de dum " << x << endl; } 
}; 

Blah foo() 
{ 
    Blah const a(1); 
    if(fermatWasRight()) { return Blah(2); } 
    return a; 
} 

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

मुझे औपचारिकता के बारे में निश्चित नहीं है, लेकिन उपरोक्त, ऑब्जेक्ट में अधिक पेलोड के साथ, ताकि प्रतिलिपि अधिक महंगा हो, एक ऐसा मामला है जहां चलने वाले अर्थशास्त्र मदद कर सकते हैं, ताकि ऑप्टिमाइज़ेशन की गारंटी हो कंपाइलर के स्मारक (या नहीं)।

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

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