ভূমিকা
প্রযুক্তিগত ওভারভিউয়ের জন্য - এই উত্তরটি এড়িয়ে যান ।
সাধারণ ক্ষেত্রে যেখানে অনুলিপি এলিজেন ঘটে - এই উত্তরটি এড়িয়ে যান ।
কিছু পরিস্থিতিতে অতিরিক্ত (সম্ভাব্য ব্যয়বহুল) অনুলিপি প্রতিরোধ করতে বেশিরভাগ সংকলক দ্বারা কপি এলিজেন বাস্তবায়ন একটি অপ্টিমাইজেশন। এটি মান দ্বারা প্রত্যাবর্তন করে বা বাস্তবে পাস-বাই-মানকে সম্ভব করে তোলে (সীমাবদ্ধতা প্রযোজ্য)।
এটি অপ্টিমাইজেশনের একমাত্র ফর্ম যা এলিডগুলি (হ্যাক!) বিস্ময়কর নিয়ম - অনুলিপি / মুভিংয়ের পার্শ্ব-প্রতিক্রিয়া থাকলেও অনুলিপি প্রয়োগ করা যেতে পারে ।
নিম্নলিখিত উদাহরণটি উইকিপিডিয়া থেকে নেওয়া :
struct C {
C() {}
C(const C&) { std::cout << "A copy was made.\n"; }
};
C f() {
return C();
}
int main() {
std::cout << "Hello World!\n";
C obj = f();
}
সংকলক এবং সেটিংসের উপর নির্ভর করে, নিম্নলিখিত আউটপুটগুলি সমস্ত বৈধ :
ওহে বিশ্ব!
একটি কপি তৈরি করা হয়েছিল।
একটি কপি তৈরি করা হয়েছিল।
ওহে বিশ্ব!
একটি কপি তৈরি করা হয়েছিল।
ওহে বিশ্ব!
এর অর্থ হ'ল কম বস্তু তৈরি করা যায়, সুতরাং আপনি ডেকে পাঠানো নির্দিষ্ট সংখ্যক ধ্বংসকারীদের উপরও নির্ভর করতে পারবেন না। অনুলিপি / মুভ-কনস্ট্রাক্টর বা ডেস্ট্রাক্টরগুলির ভিতরে আপনার কাছে সমালোচনা যুক্তিযুক্ত হওয়া উচিত নয়, কারণ আপনি তাদের ডেকে যাওয়ার উপর নির্ভর করতে পারবেন না।
যদি কোনও অনুলিপি বা মুভ কনস্ট্রাক্টরকে কল দেওয়া হয় তবে সেই কনস্ট্রাক্টরটির অবশ্যই উপস্থিত থাকতে হবে এবং অবশ্যই অ্যাক্সেসযোগ্য। এটি নিশ্চিত করে যে অনুলিপি এলিজেন্সগুলি সাধারণত অনুলিপিযোগ্য অবজেক্টগুলিকে অনুলিপি করার অনুমতি দেয় না, যেমন তাদের ব্যক্তিগত বা মোছা অনুলিপি / সরানো কনস্ট্রাক্টর রয়েছে।
সি ++ ১ :: সি ++ ১ of অনুসারে, কোনও বস্তু সরাসরি ফেরত দেওয়া হলে অনুলিপি নিশ্চিত করা হবে:
struct C {
C() {}
C(const C&) { std::cout << "A copy was made.\n"; }
};
C f() {
return C(); //Definitely performs copy elision
}
C g() {
C c;
return c; //Maybe performs copy elision
}
int main() {
std::cout << "Hello World!\n";
C obj = f(); //Copy constructor isn't called
}