Copy elision
सी + + कंप्यूटर प्रोग्रामिंग में, प्रतिलिपि विलोपन एक संकलक अनुकूलन तकनीक को संदर्भित करता है जो वस्तुओं की अनावश्यक प्रतिलिपि को समाप्त करता है। सी + + भाषा मानक आम तौर पर कार्यान्वयन को किसी भी अनुकूलन को करने की अनुमति देता है, बशर्ते कि परिणामी कार्यक्रम का अवलोकन योग्य व्यवहार समान हो, अर्थात। नाटक करते हुए, कार्यक्रम को मानक द्वारा अनिवार्य रूप से निष्पादित किया गया था। इसके अलावा, मानक कुछ स्थितियों का भी वर्णन करता है जहां नकल को समाप्त किया जा सकता है, भले ही यह कार्यक्रम के व्यवहार को बदल दे, सबसे आम वापसी मूल्य अनुकूलन है (नीचे देखें)। सी + + मानक में वर्णित एक अन्य व्यापक रूप से लागू अनुकूलन, तब होता है जब वर्ग प्रकार की एक अस्थायी वस्तु को उसी प्रकार की वस्तु के लिए प्रतिलिपि बनाया जाता है। नतीजतन, प्रतिलिपि-आरंभीकरण आमतौर पर प्रदर्शन के संदर्भ में प्रत्यक्ष-आरंभीकरण के बराबर होता है, लेकिन शब्दार्थ में नहीं; प्रतिलिपि-आरंभीकरण के लिए अभी भी एक सुलभ प्रतिलिपि निर्माता की आवश्यकता होती है। अनुकूलन को एक अस्थायी वस्तु पर लागू नहीं किया जा सकता है जो एक संदर्भ से बंधी हुई है। उदाहरण #include <iost stream> int n = 0; संरचना C {स्पष्ट C (int) {} C (स्थिरांक C &) {+ + n;}/प्रतिलिपि निर्माता का एक दृश्य दुष्प्रभाव होता है};// यह स्थिर भंडारण अवधि के साथ एक वस्तु को संशोधित करता है int मुख्य () {C c1 (42);// प्रत्यक्ष-आरंभीकरण, कॉल C:: C (पूर्णांक) C c2 = C (42);// प्रतिलिपि-आरंभीकरण, कॉल C:: C (स्थिरांक C &) std:: cout <<n <std:// प्रिंट 0 यदि प्रतिलिपि को हटा दिया गया था, अन्यथा 1] मानक a के अनुसार यह भी स्पष्ट नहीं है कि क्या यह अनुकूलन केवल अस्थायी वस्तुओं पर लागू होता है, या नामित वस्तुओं पर भी लागू होता है। निम्नलिखित स्रोत कोड दिया गया हैः #include <iost stream> संरचना C {C () = डिफ़ॉल्ट; C (स्थिरांक C &) {std:: cout <<"हैलो वर्ल्ड! \n";}; शून्य f () {C c; फेंक c;// नामित वस्तु c को अपवाद वस्तु में प्रतिलिपि बनाना। //यह स्पष्ट नहीं है कि क्या इस प्रति को हटा दिया जा सकता है (छोड़ दिया गया है)। पूर्णांक मुख्य () {कोशिश करें {f ();} पकड़ें (C c) {// अपवाद घोषणा में अस्थायी में अपवाद वस्तु की प्रतिलिपि बनाना। //यह भी स्पष्ट नहीं है कि क्या इस प्रति को हटा दिया जा सकता है (छोड़ दिया गया)। इसलिए एक अनुरूप संकलक को एक प्रोग्राम तैयार करना चाहिए जो "हैलो वर्ल्ड!" प्रिंट करता है। दो बार। सी + + मानक (सी + + 11) के वर्तमान संशोधन में, मुद्दों को संबोधित किया गया है, अनिवार्य रूप से नामित वस्तु से अपवाद वस्तु तक की प्रतिलिपि और अपवाद संचालक में घोषित वस्तु में प्रतिलिपि दोनों को अनुमति दी गई है। जी. सी. सी. प्रतिलिपि-विलोपन को अक्षम करने के लिए-fno-elide-कंस्ट्रक्टर्स विकल्प प्रदान करता है। यह विकल्प वापसी मूल्य अनुकूलन या अन्य अनुकूलन के प्रभावों को देखने (या न देखने) के लिए उपयोगी है जहां प्रतियां समाप्त हो जाती हैं। आम तौर पर इस महत्वपूर्ण अनुकूलन को अक्षम करने की अनुशंसा नहीं की जाती है। वापसी मूल्य अनुकूलन सी + + प्रोग्रामिंग भाषा के संदर्भ में, वापसी मूल्य अनुकूलन (आर. वी. ओ.) एक संकलक अनुकूलन है जिसमें किसी कार्य के वापसी मूल्य को धारण करने के लिए बनाई गई अस्थायी वस्तु को समाप्त करना शामिल है। आर. वी. ओ. को सी + + मानक द्वारा परिणामी कार्यक्रम के अवलोकन योग्य व्यवहार को बदलने की अनुमति है। सारांश सामान्य तौर पर, सी + + मानक एक संकलक को किसी भी अनुकूलन को करने की अनुमति देता है, बशर्ते कि परिणामी निष्पादन योग्य वही अवलोकन योग्य व्यवहार प्रदर्शित करता है जैसे कि (यानी। ढोंग करते हुए) मानक की सभी आवश्यकताओं को पूरा किया गया है। इसे आमतौर पर "एज़-इफ रूल" के रूप में जाना जाता है। रिटर्न वैल्यू ऑप्टिमाइजेशन शब्द सी + + मानक में एक विशेष खंड को संदर्भित करता है जो "ऐज-इफ" नियम से भी आगे जाता हैः एक कार्यान्वयन रिटर्न स्टेटमेंट के परिणामस्वरूप एक कॉपी ऑपरेशन को छोड़ सकता है, भले ही कॉपी कंस्ट्रक्टर के दुष्प्रभाव हों। निम्नलिखित उदाहरण एक ऐसे परिदृश्य को दर्शाता है जहां कार्यान्वयन एक या दोनों प्रतियों को समाप्त कर सकता है, भले ही प्रतिलिपि निर्माता का एक दृश्यमान दुष्प्रभाव (मुद्रण पाठ) हो। पहली प्रति जिसे हटाया जा सकता है वह वह है जहाँ एक अनाम अस्थायी सी को फ़ंक्शन एफ के वापसी मूल्य में कॉपी किया जा सकता है। दूसरी प्रति जिसे हटाया जा सकता है वह अस्थायी वस्तु की प्रति है जो f द्वारा ओ. बी. जे. को वापस की गई है। #include <iostोट्रीम> संरचना C {C () = डिफ़ॉल्ट; C (कॉन्स्ट C &) {std:: cout <<"एक प्रति बनाई गई थी। \n";}}; C f () {रिटर्न C ();} इंट मेन () {std:: cout <<"हैलो वर्ल्ड! \n"; C obj = f ();} संकलक और उस संकलक की सेटिंग्स के आधार पर, परिणामी प्रोग्राम निम्नलिखित में से कोई भी आउटपुट प्रदर्शित कर सकता हैः हैलो वर्ल्ड! एक प्रति बनाई गई थी। एक प्रति बनाई गई थी। हैलो वर्ल्ड! एक प्रति बनाई गई थी। हैलो वर्ल्ड! किसी कार्य से अंतर्निर्मित प्रकार की वस्तु को वापस करने की पृष्ठभूमि में आमतौर पर बहुत कम या कोई ऊपरी भार नहीं होता है, क्योंकि वस्तु आमतौर पर एक सीपीयू रजिस्टर में फिट बैठती है। वर्ग प्रकार की एक बड़ी वस्तु को वापस करने के लिए एक स्मृति स्थान से दूसरे स्थान पर अधिक महंगी प्रतिलिपि बनाने की आवश्यकता हो सकती है। इससे बचने के लिए, एक कार्यान्वयन कॉलर के स्टैक फ्रेम में एक छिपी हुई वस्तु बना सकता है, और इस वस्तु के पते को कार्य में पारित कर सकता है। फिर फ़ंक्शन के वापसी मूल्य को छिपी हुई वस्तु में कॉपी किया जाता है। इस प्रकार, कोड इस प्रकार हैः संरचना डेटा {चार बाइट्स [16];}; डेटा एफ () {डेटा परिणाम = {};// परिणाम वापसी परिणाम उत्पन्न करें;} इंट मेन () {डेटा डी = एफ ();} इसके समकक्ष कोड उत्पन्न कर सकता हैः संरचना डेटा {चार बाइट्स [16];}; डेटा * एफ (डेटा * _ हिडनएड्ड्रेस) {डेटा परिणाम = {};// परिणाम को हिडन ऑब्जेक्ट में कॉपी करें * _ हिडनएड्ड्रेस = परिणाम; रिटर्न _ हिडनएड्ड्रेस;} इंट मेन () {डेटा _ हिडन;// हिडन ऑब्जेक्ट डेटा डी = * एफ (& _ हिडन) बनाएँ;// परिणाम को डी में कॉपी करें जिससे डेटा ऑब्जेक्ट को दो बार कॉपी किया जा सके। सी + + के विकास के प्रारंभिक चरणों में, किसी फलन से वर्ग प्रकार की वस्तु को कुशलता से वापस करने में भाषा की अक्षमता को एक कमजोरी माना जाता था। 1991 के आसपास, वाल्टर ब्राइट ने नकल को कम करने के लिए एक तकनीक लागू की, प्रभावी रूप से छिपी हुई वस्तु और फ़ंक्शन के अंदर नामित वस्तु को परिणाम को पकड़ने के लिए उपयोग की जाने वाली वस्तु के साथ बदल दियाः संरचना डेटा {चार बाइट्स [16];}; शून्य F (डेटा * p) {// सीधे * p} इंट मेन () {डेटा d; F (& d);} में परिणाम उत्पन्न करें ब्राइट ने अपने ज़ोरटेक C + + संकलक में इस अनुकूलन को लागू किया। इस विशेष तकनीक को बाद में "नामित वापसी मूल्य अनुकूलन" (एन. आर. वी. ओ.) बनाया गया, इस तथ्य का उल्लेख करते हुए कि एक नामित वस्तु की प्रतिलिपि को समाप्त कर दिया गया है। कम्पाइलर समर्थन रिटर्न मूल्य अनुकूलन अधिकांश संकलकों पर समर्थित है। हालाँकि, ऐसी परिस्थितियाँ हो सकती हैं जहाँ संकलक अनुकूलन करने में असमर्थ हो। एक सामान्य मामला यह है कि जब कोई फ़ंक्शन निष्पादन के पथ के आधार पर अलग-अलग नामित वस्तुओं को वापस कर सकता हैः #include <स्ट्रिंग> std:: स्ट्रिंग F (बूल कंड = गलत) {std:: स्ट्रिंग पहले ("पहला"); std:: स्ट्रिंग दूसरा ("दूसरा");// फ़ंक्शन अपने तर्क के आधार पर दो नामित वस्तुओं में से एक को वापस कर सकता है। हो सकता है कि आर. वी. ओ. को वापसी के लिए लागू न किया जाए? पहलाः दूसरा;} पूर्णांक मुख्य () {std:: स्ट्रिंग परिणाम = F ();} बाहरी लिंक cppreference.com संदर्भों पर विलोपन की प्रतिलिपि बनाएँ उदाहरण के साथ लेख C + + कोड संकलक अनुकूलन C + +