2012-05-30 12 views
6

मैं निम्नलिखित कोड लिखा है:सी ++ लौटने एक वस्तु की नकल

class MyObjectHolder { 
public: 
    std::vector<int> getMyObject() const { 
     return myObject; 
    } 

private: 
    std::vector<int> myObject; 
}; 

मेरा कार्यक्रम के कुछ बिंदु पर मैं getMyObject विधि का उपयोग करें और पुनः प्राप्त वस्तु पर केवल const विधियों का उपयोग करते:

const std::vector<int> myObject = myObjectHolder.getMyObject(); 
myObject.size(); 
int a = myObject.front(); 
  • अब, क्या यह संभव है कि संकलक इस कोड को अनुकूलित करे ताकि की कोई प्रतियां कर रहे हैं?

    संकलक निर्धारित करता है कि कि मैं केवल पुनः प्राप्त वस्तु पर const तरीकों का उपयोग कर रहा हूँ यह किसी भी तरह संभव है (और मान लेते हैं कोई mutable बकवास इसके पीछे क्या हो रहा है है) और यह किसी भी प्रतियां बनाने नहीं होता ऑब्जेक्ट्स के पर के सदस्य const संचालन करते हैं?

  • यदि हाँ, यह संभव है कि अगर मैं स्पष्ट रूप से const रूप const std::vector<int> myObject घोषित नहीं किया हो सकता है?

  • यदि नहीं, तो ऐसा करने के कारण क्या हैं? किस मामले में यह अनुकूलन लागू करना/कटौती करना मुश्किल होगा कि यह संभव है और यहां सही है/आदि ...?

+2

[आरवीओ] (http://en.wikipedia.org/wiki/Return_value_optimization) में अस्थायी वस्तुएं शामिल हैं। जब तक मुझे कुछ याद नहीं आ रहा है, वहां कोई अस्थायी वस्तुएं नहीं हैं इसलिए कोई आरवीओ नहीं है। – hmjd

+0

@hmjd दाएं। मुझे 'आरवीओ' के बारे में बात नहीं करनी चाहिए, बस 'निजी' चर का उपयोग करने के साथ संभावित अनुकूलन के बारे में। धन्यवाद। –

उत्तर

6

साथ परिणाम उपयोग करें, यह है कि संकलक इस कोड को इतना है कि std::vector<int> का कोई प्रतियां किया जाता है अनुकूलित करेंगे संभव है?

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

यदि हां, तो क्या यह संभव होगा यदि मैंने स्पष्ट रूप से कॉन्स्ट के रूप में stst :: vector myObject को स्पष्ट रूप से घोषित नहीं किया?

नहीं, वैसे भी गैर-कॉन्स से कॉन्स्ट में रूपांतरण अंतर्निहित हो सकता है।

यदि नहीं, तो ऐसा करने के कारण क्या हैं? किस मामले में यह अनुकूलन लागू करना/कटौती करना मुश्किल होगा कि यह संभव है और यहां सही है/आदि ...?

यह एक ऑप्टिमाइज़ेशन है जो getMyObject() के अंदर किया जाना चाहिए लेकिन संकलक यह सुनिश्चित नहीं कर सकता कि कॉलर्स कॉन्स को नहीं हटाएंगे। दरअसल यह const के उपयोग के बारे में एक बहुत पुरानी बहस है, आमतौर पर मुझे लगता है कि const प्रोग्रामर के लिए कुछ नहीं बल्कि कंपेलरों के लिए हमेशा के बारे में सोचना अधिक स्पष्ट है।

+1

"नहीं, संकलक नहीं जानता कि कॉलर उस ऑब्जेक्ट के साथ क्या करेगा।" -> आम तौर पर सही नहीं है। प्रस्तावित परिवर्तन: "जब तक आप ऑब्जेक्ट के सभी कोडों पर वैश्विक अनुकूलन का उपयोग नहीं कर रहे हैं, तब तक संकलक आम तौर पर धारणाएं नहीं बना सकता" या इसी तरह। –

+0

@phresnel आप सही हैं (संपादित), इसके अलावा यदि वस्तु निर्यात की जाती है तो यह कोई धारणा नहीं कर सकती है (और मुझे यकीन नहीं है कि यह एक ही इकाई के अंदर भी कास्ट का पालन कर सकता है)। –

+1

और भी, कंपेलर को एक ही फ़ंक्शन के कई संस्करणों को थूकने की अनुमति है, जिसका अर्थ है कि एक और अधिक सामान्यीकृत संपादन: पी –

3

मैं

const std::vector<int>& getMyObject() const { 
    return myObject; 
} 

उपयोग करने के लिए यह नकल है कि बिना myObject की लगातार संदर्भ वापसी होगी सुझाव है।

और अब

const std::vector<int>& myObject = myObjectHolder.getMyObject(); 
0

यह Copy Elision और Return Value Optimization में शुरू होगा। आप C++11 समर्थन के साथ सी ++ संकलक का उपयोग करते हैं, तो आप हो यह move semantics द्वारा अनुकूलित कर सकते हैं संभव है।

मैं डेव अब्राहम द्वारा उत्कृष्ट लेख Want Speed? Pass by Value को नीचे टिप्पणी में चर्चा के साथ पढ़ने की सलाह दूंगा।

हालांकि, विवरण के लिए आपको अपने सी ++ कंपाइलर के दस्तावेज़ीकरण का संदर्भ लेना चाहिए।