कॉपी एलिजन केवल तब होता है जब एक प्रति वास्तव में आवश्यक नहीं होती है। विशेष रूप से, यह तब होता है जब एक ऑब्जेक्ट होता है (इसे ए कॉल करें) जो किसी फ़ंक्शन के निष्पादन की अवधि के लिए मौजूद होता है, और दूसरी ऑब्जेक्ट (इसे बी कहते हैं) जिसे पहले ऑब्जेक्ट से बनाया गया प्रतिलिपि बनाई जाएगी, और इसके बाद तत्काल , ए नष्ट हो जाएगा (यानी समारोह से बाहर निकलने पर)।
इस विशिष्ट मामले में, मानक कंपाइलर को ए और बी को उसी ऑब्जेक्ट का जिक्र करने के दो अलग-अलग तरीकों से जोड़ने की अनुमति देता है।ए को बनाने की आवश्यकता के बजाय, बी को ए से निर्मित प्रतिलिपि बनाई जाए, और फिर ए को नष्ट किया जाए, यह ए और बी को उसी वस्तु का जिक्र करने के दो तरीकों के रूप में माना जा सकता है, इसलिए (एक) वस्तु ए के रूप में बनाई गई है, और फ़ंक्शन रिटर्न के बाद बी के रूप में संदर्भित होने लगते हैं, लेकिन यदि प्रतिलिपि बनाने वाले के साइड इफेक्ट्स हैं, तो प्रतिलिपि बी से बी बनाने वाली प्रतिलिपि अभी भी छोड़ दी जा सकती है। साथ ही, ध्यान दें कि इस मामले में ए (बी से अलग वस्तु के रूप में) कभी भी नष्ट नहीं होता है - उदाहरण के लिए, यदि आपके डाटर के दुष्प्रभाव भी थे, तो वे भी छोड़े जा सकते थे।
आपका कोड उस पैटर्न को फिट नहीं करता है - पहली वस्तु दूसरे ऑब्जेक्ट को प्रारंभ करने के लिए उपयोग किए जाने के तुरंत बाद मौजूद नहीं रहती है। F()
रिटर्न के बाद, ऑब्जेक्ट के दो उदाहरण हैं। यह मामला है, [नामित] रिटर्न वैल्यू ऑप्टिमाइज़ेशन (उर्फ कॉपी एलिशन) बस लागू नहीं होता है।
डेमो कोड जब प्रतिलिपि इलिजन लागू होगा:
#include <iostream>
struct foo {
foo(): a(5) { }
foo(const foo& f): a(f.a) { std::cout << "meep meep!\n"; }
int a;
};
int F() {
// RVO
std::cout << "F\n";
return foo();
}
int G() {
// NRVO
std::cout << "G\n";
foo x;
return x;
}
int main() {
foo a = F();
foo b = G();
return 0;
}
दोनों एमएस कुलपति ++ और जी ++ का अनुकूलन दूर दोनों ctors इस कोड से कॉपी अनुकूलन के साथ चालू कर दिया। जी ++ ऑप्टिमाइज़ेशन बंद होने पर भी दोनों को अनुकूलित करता है। ऑप्टिमाइज़ेशन बंद होने के साथ, वीसी ++ अज्ञात रिटर्न को ऑप्टिमाइज़ करता है, लेकिन नामित रिटर्न के लिए कॉपी सीटीआर का उपयोग करता है।
स्रोत
2010-04-26 23:29:51
क्या आप पूछ रहे हैं कि कॉपी इंस्टालर को मूल उदाहरण के फील्ड मान को वापस करने के बजाय क्यों कहा जाता है? –
आप कैसे जानते हैं कि यह elided नहीं था। और आपको ऐसा क्यों लगता है कि यह होना चाहिए था? कृपया इन प्रश्नों के संबंध में अपने प्रश्न को संशोधित करें। –
@ माइकल, यह सही है। –