2012-08-09 15 views
6

मैं push_back एक vector इस तरह में एक अस्थायी वस्तु,vector.push_back rvalue और कॉपी-इलिजन

vector<A> vec; 
vec.push_back(A("abc")); 

संकलक कॉपी-इलिजन सीधे vector में अस्थायी A("abc") निर्माण करने के लिए लागू होगा, कि A इसलिए ' vec में अस्थायी वस्तु को दबाते समय एस कॉपी सीटीआर ट्रिगर नहीं किया जाएगा।

+0

मुझे ऐसा नहीं लगता क्योंकि 'वेक्टर' (वास्तव में एसटीएल आवंटक) नियुक्ति 'नया' का उपयोग करता है। –

+0

@ सेठ कार्नेगी - यह प्लेसमेंट 'नया' से कैसे संबंधित है? मान लें कि आपके पास वेक्टर में पर्याप्त खाली स्थान है, फिर एक कंपाइलर केवल 'ए' जगह का एक उदाहरण बना सकता है। –

+0

@Nya क्योंकि संकलक शायद यह नहीं समझ पाएगा कि यह कहां बनाया जाएगा (ऐसा नहीं है कि यह नहीं हो सकता है, लेकिन ऐसा नहीं होगा, क्योंकि संकलक लेखकों ने उस अनुकूलन को नहीं लिखा था)। –

उत्तर

5

यदि आपके पास एक संकलक है जो रैवल्यू संदर्भों का समर्थन करता है, तो इसे वेक्टर में स्थानांतरित किया जाएगा, जो कभी-कभी काफी सस्ता होता है।

इसका एक विकल्प सीधे वेक्टर में ऑब्जेक्ट का निर्माण करना है, जिसे vec.emplace_back("abc"); के साथ किया जा सकता है। यह केवल एक कन्स्ट्रक्टर का आह्वान करता है।

इनमें से दोनों सी ++ 11 विशेषताएं हैं। कॉपी एलिजन की अनुमति नहीं है, इसलिए उन सुविधाओं के बिना कॉपी अभी भी बनाई जाएगी।

हालांकि, अगर कॉपी कन्स्ट्रक्टर के पास कोई अवलोकन दुष्प्रभाव नहीं है (जो इसे वैसे भी नहीं होना चाहिए), तो एक स्मार्ट कंपाइलर अभी भी उस अनुकूलन को निष्पादित कर सकता है, क्योंकि "as-if" नियम किसी भी अनुकूलन की अनुमति देता है जिसके परिणामस्वरूप एक ही देखने योग्य व्यवहार। मुझे नहीं पता कि कोई मौजूदा कंपाइलर ऐसा करता है, हालांकि। यदि नहीं, तो मुझे संदेह है कि कोई भी इस तरह के अनुकूलन को जोड़ने का प्रयास करेगा क्योंकि रावल संदर्भों ने उस आवश्यकता को समाप्त कर दिया है।

+0

मैं अभी सी ++ 11 का उपयोग नहीं कर रहा हूं। – Alcott

+0

@ एल्कोट तो एक प्रतिलिपि बनाने की संभावना है। –

+0

@ आर। मार्टिन्होफर्नैंड्स या असाइनमेंट ऑपरेटर को बुलाया जाएगा; मैंने दोनों मामलों को देखा है, और मेरा मानना ​​है कि यह इस बात पर निर्भर करता है कि एक प्रतिलिपि निर्माता को परिभाषित किया गया है या यदि कक्षा के लिए एक असाइनमेंट ऑपरेटर परिभाषित किया गया है (शायद दोनों?)। एक और कारण है कि "प्रभावी एसटीएल" सभी सी ++ डेवलपर्स के लिए जरूरी है; मेयर्स एसटीएल कंटेनरों के साथ कक्षाओं का उपयोग करने के बारे में बात करते हैं, और उन वर्गों को लागू करने के तरीके को छूते हैं जो उनके भीतर संग्रहीत किए जाएंगे। – Will

1

सामान्य मामले में, यह नहीं किया जा सकता है, यह संभवतः यहां किया जा सकता है क्योंकि vector एक टेम्पलेट है और कोड को रेखांकित किया जा सकता है, जिससे ऑप्टिमाइज़र को यह काम करने और कार्य की कुछ आवश्यकताओं को राहत देने के लिए अधिक जानकारी दी जा सकती है कहता है।

सामान्य स्थिति में, दो वस्तुओं को स्मृति में एक ही स्थान पर रखकर और एक ही ऑब्जेक्ट को संदर्भित करने के लिए केवल दो नाम रखकर elision कार्यों की प्रतिलिपि बनाएँ। इस मामले में समस्या यह होगी कि तर्कों में से एक वेक्टर (गतिशील रूप से आवंटित, किसी विशेष स्थिति पर) के अंदर स्थित होना चाहिए, और दूसरा फ़ंक्शन के लिए एक तर्क है, जो कॉलिंग सम्मेलन द्वारा किसी विशेष स्थिति में बाध्य हो सकता है ढेर में यदि ऐसा है, तो संकलक प्रतिलिपि अनुकूलित करने में सक्षम नहीं होगा।

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

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