2011-03-12 11 views
14

क्या संकलक को की प्रतिलिपि को कॉपी करता है जो द्वारा मूल्य-मूल्य के लिए आवश्यक है?सी ++ 0x: लैम्ब्डा के मूल्य से कैप्चर करें, हमेशा एक प्रतिलिपि?

vector<Image> movie1; 
apply([=movie1](){ return movie1.size(); }); 
  • वहाँ किसी भी परिस्थिति है कि संकलक movie1 नकल की जरूरत नहीं है है?
    • शायद अगर संकलक को पता चले कि apply वास्तव में movie1 बदलता है?
    • या यह मदद करता है कि लैम्बडास डिफ़ॉल्ट रूप से const फ़ैक्टर किसी भी मामले में हैं?
  • यह सब पर में मदद करता है vector एक चाल निर्माता और कदम आवंटित है?
    • यदि हां, तो क्या इन्हें यहां एक महंगी प्रति को रोकने के लिए Image पर जोड़ने की आवश्यकता है?
  • वहाँ तंत्र में एक फर्क है कि कब और कैसे एक प्रति दर-मूल्य पर कब्जादर-मूल्य तर्कों की तुलना में के लिए आवश्यक है? जैसे। void operate(vector<Image> movie)?

उत्तर

9

मुझे पूरा यकीन है कि यह नहीं कर सकता है।

भले ही बाहरी फ़ंक्शन अब चर का उपयोग नहीं करता है, वैरिएबल को स्थानांतरित करने से विनाश के अर्थशास्त्र बदल जाएंगे। Image के लिए

होने चाल कंस्ट्रक्टर्स उसके तत्वों ले जाए बिना मदद नहीं करता है, एक vector कर सकते हैं move या swap

यदि चर केवल इस बिंदु से पढ़ा जाता है, संदर्भ द्वारा कैप्चर क्यों नहीं किया जाता है? आप एक कॉन्स संदर्भ भी बना सकते हैं और इसे कैप्चर कर सकते हैं।

यदि चर केवल पढ़ने के लिए नहीं है, तो प्रतिलिपि आवश्यक है। इससे कोई फर्क नहीं पड़ता कि बाहरी कार्य या लैम्ब्डा संशोधन करता है, संकलक उस संशोधन को दूसरे के लिए दृश्यमान होने की अनुमति नहीं दे सकता है।

फर्क सिर्फ इतना है कि मैं के बीच देखने से-मूल्य पर कब्जा और दर-मान तर्क गुजर कि कब्जा नाम दिया गया है, यह एक अस्थायी नहीं हो सकता। अस्थायी रूप से लागू होने वाले अनुकूलन उत्तीर्ण करने का तर्क उपयोग नहीं किया जा सकता है।

+0

"संदर्भ द्वारा कैप्चर क्यों नहीं करें"? मैं सभी प्रभावों को समझने की प्रक्रिया में हूं। मैं सहमत हूँ। "एकमात्र अंतर ..." एक अच्छा जवाब है। उत्तम! – towi

3

हमेशा "as-if" नियम है। जब तक यह लगता है जैसे नियमों का पालन किया गया था, तो संकलक जो कुछ भी पसंद कर सकता है। तो उन वस्तुओं के लिए जहां कॉपी कन्स्ट्रक्टर और विनाशक का कोई साइड इफेक्ट नहीं होता है, और जहां कॉपी में कोई बदलाव नहीं किया जाता है, या मूल ऑब्जेक्ट को बाद में एक्सेस नहीं किया जाता है (इसलिए कोई भी नोटिस करेगा कि हम ऑब्जेक्ट में बदलाव करते हैं), कंपाइलर साबित कर सकता है कि प्रतिलिपि को समाप्त करना "जैसा-अगर" नियम के तहत कानूनी है।

लेकिन इसके अलावा, नहीं, यह सिर्फ कॉपी को खत्म नहीं कर सकता, जैसा कि @ बेन ने कहा था। "नियमित" प्रतिलिपि नियम इस मामले को शामिल नहीं करते हैं।

+0

वह शब्द है जो मैं ढूंढ रहा था: * कॉपी elision *। यह स्पष्ट करने के लिए धन्यवाद कि ये यहां लागू नहीं हो सकते हैं। धन्यवाद। – towi

+0

कॉपी एलिजन यहां लागू नहीं है, क्योंकि कॉपी एलिशन उन परिस्थितियों के लिए पेश किया गया था जहां आप मूल्य को प्रभावी ढंग से "आगे बढ़ रहे हैं" (मूल मान अब तक नहीं पहुंचा जा सकता है - यह कॉपी प्रारंभिकरण और वापसी मूल्य दोनों के लिए सच है)। लैम्ब्डा के मामले में आप लैम्ब्डा और मूल संदर्भ में कैप्चर किए गए मूल्य तक पहुंच सकते हैं, इसलिए यह एक वास्तविक प्रति है। – Suma

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