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 যদি অনুলিপিটি বাদ দেওয়া হয়, অন্যথায় এটিও স্পষ্ট নয় যে এই অপ্টিমাইজেশন শুধুমাত্র অস্থায়ী বস্তুর ক্ষেত্রে প্রযোজ্য, নাকি নামযুক্ত বস্তুর ক্ষেত্রেও প্রযোজ্য। নিম্নলিখিত উৎস কোডটি দেওয়া হয়েছেঃ #include <iost stream> কাঠামো C {C () = ডিফল্ট; C (স্থিরাংক C &) {std:: cout <<"হ্যালো ওয়ার্ল্ড! \n";}; বাতিল f () {C c; নিক্ষেপ c;// ব্যতিক্রম বস্তুর মধ্যে নামযুক্ত বস্তু c অনুলিপি করা। //এই অনুলিপিটি বাদ দেওয়া হতে পারে কিনা তা স্পষ্ট নয়। int প্রধান () {চেষ্টা করুন {f ();} ধরা (সি সি) {// ব্যতিক্রম বস্তুটিকে// ব্যতিক্রম ঘোষণায় অস্থায়ীভাবে অনুলিপি করা হচ্ছে। //এই অনুলিপিটি মুছে ফেলা (বাদ দেওয়া) হতে পারে কিনা তাও স্পষ্ট নয়। একজন সঙ্গতিপূর্ণ সংকলকের তাই এমন একটি প্রোগ্রাম তৈরি করা উচিত যা "হ্যালো ওয়ার্ল্ড!" প্রিন্ট করে। দুইবার। সি + + স্ট্যান্ডার্ডের (সি + + 11) বর্তমান সংশোধনে, সমস্যাগুলি সমাধান করা হয়েছে, মূলত নামযুক্ত বস্তু থেকে ব্যতিক্রম বস্তুর অনুলিপি এবং ব্যতিক্রম হ্যান্ডলারে ঘোষিত বস্তুর অনুলিপি উভয়কেই অনুমতি দেওয়া হয়েছে। জিসিসি কপি-এলিশন নিষ্ক্রিয় করার জন্য-fno-elide-কন্সট্রাক্টর বিকল্প প্রদান করে। এই বিকল্পটি রিটার্ন ভ্যালু অপ্টিমাইজেশন বা অন্যান্য অপ্টিমাইজেশনের প্রভাবগুলি পর্যবেক্ষণ করতে (বা পর্যবেক্ষণ না করতে) কার্যকর যেখানে অনুলিপিগুলি বাদ দেওয়া হয়। সাধারণত এই গুরুত্বপূর্ণ অপ্টিমাইজেশানটি নিষ্ক্রিয় করার পরামর্শ দেওয়া হয় না। রিটার্ন ভ্যালু অপ্টিমাইজেশন সি + + প্রোগ্রামিং ভাষার প্রসঙ্গে, রিটার্ন ভ্যালু অপ্টিমাইজেশন (আরভিও) একটি কম্পাইলার অপ্টিমাইজেশন যা কোনও ফাংশনের রিটার্ন ভ্যালু ধরে রাখার জন্য তৈরি করা অস্থায়ী বস্তুটিকে অপসারণ করে। আরভিও-কে সি + + মান দ্বারা ফলস্বরূপ প্রোগ্রামের পর্যবেক্ষণযোগ্য আচরণ পরিবর্তন করার অনুমতি দেওয়া হয়। সাধারণভাবে, সি + + মান একটি সংকলককে যে কোনও অপ্টিমাইজেশন সম্পাদন করার অনুমতি দেয়, যদি ফলস্বরূপ এক্সিকিউটেবল একই পর্যবেক্ষণযোগ্য আচরণ প্রদর্শন করে (অর্থাৎ। ভান করা) মানের সমস্ত প্রয়োজনীয়তা পূরণ করা হয়েছে। এটিকে সাধারণত "যেমন-যদি নিয়ম" হিসাবে উল্লেখ করা হয়। রিটার্ন ভ্যালু অপ্টিমাইজেশন শব্দটি সি + + স্ট্যান্ডার্ডের একটি বিশেষ ধারাকে বোঝায় যা "যেমন-যদি" নিয়মের চেয়েও বেশি যায়ঃ একটি বাস্তবায়ন রিটার্ন স্টেটমেন্টের ফলে একটি অনুলিপি অপারেশন বাদ দিতে পারে, এমনকি কপি কনস্ট্রাক্টরের পার্শ্ব প্রতিক্রিয়া থাকলেও। নিম্নলিখিত উদাহরণটি এমন একটি পরিস্থিতি প্রদর্শন করে যেখানে বাস্তবায়নটি একটি বা উভয় অনুলিপি তৈরি করা মুছে ফেলতে পারে, এমনকি যদি অনুলিপি নির্মাণকারীর একটি দৃশ্যমান পার্শ্ব প্রতিক্রিয়া (মুদ্রণ পাঠ্য) থাকে। প্রথম যে অনুলিপিটি বাদ দেওয়া যেতে পারে সেটি হল যেখানে একটি নামহীন অস্থায়ী সি-কে f-এর রিটার্ন মান ফাংশনে অনুলিপি করা যেতে পারে। দ্বিতীয় যে অনুলিপিটি বাদ দেওয়া যেতে পারে তা হল অস্থায়ী বস্তুর অনুলিপি যা f দ্বারা ওবজেকে ফেরত দেওয়া হয়েছে। #include <আইওস্ট্রিম> কাঠামো সি {সি () = ডিফল্ট; সি (কনস্ট সি &) {এসটিডিঃ: cout <<"একটি অনুলিপি তৈরি করা হয়েছিল। \n";}}; সি এফ () {রিটার্ন সি ();} ইন্ট মেইন () {এসটিডিঃ: cout <<<"হ্যালো ওয়ার্ল্ড! \n"; সি ওবজে = এফ ();} সংকলক এবং সেই সংকলকের সেটিংসের উপর নির্ভর করে, ফলস্বরূপ প্রোগ্রামটি নিম্নলিখিত যে কোনও আউটপুট প্রদর্শন করতে পারেঃ হ্যালো ওয়ার্ল্ড! একটি অনুলিপি তৈরি করা হয়েছিল। একটি অনুলিপি তৈরি করা হয়েছিল। হ্যালো ওয়ার্ল্ড! একটি অনুলিপি তৈরি করা হয়েছিল। হ্যালো ওয়ার্ল্ড! কোনও ফাংশন থেকে অন্তর্নির্মিত ধরনের কোনও বস্তুর ব্যাকগ্রাউন্ড রিটার্ন করা সাধারণত খুব কম বা কোনও ওভারহেড বহন করে না, কারণ বস্তুটি সাধারণত একটি সিপিইউ রেজিস্টারে ফিট করে। ক্লাস টাইপের একটি বড় বস্তু ফেরত দেওয়ার জন্য একটি মেমরি অবস্থান থেকে অন্য জায়গায় অনুলিপি করার জন্য আরও ব্যয়বহুল প্রয়োজন হতে পারে। এটি এড়ানোর জন্য, একটি বাস্তবায়ন কলারের স্ট্যাক ফ্রেমে একটি লুকানো বস্তু তৈরি করতে পারে এবং এই বস্তুর ঠিকানাটি ফাংশনে পাস করতে পারে। ফাংশনটির রিটার্ন মান তারপর লুকানো বস্তুতে অনুলিপি করা হয়। সুতরাং, এই ধরনের কোডঃ স্ট্রাকচার ডেটা {চার বাইট্স [16];}; ডেটা এফ () {ডেটা ফলাফল = {};// ফলাফল ফেরত ফলাফল তৈরি করে;} ইন্ট মেইন () {ডেটা ডি = এফ ();} এর সমতুল্য কোড তৈরি করতে পারেঃ স্ট্রাকচার ডেটা {চার বাইট্স [16];}; ডেটা * এফ (ডেটা * _ হিডেন অ্যাড্রেস) {ডেটা ফলাফল = {};// লুকানো বস্তুর মধ্যে ফলাফল অনুলিপি করুন * _ হিডেন অ্যাড্রেস = ফলাফল; রিটার্ন _ হিডেন অ্যাড্রেস;} ইন্ট মেইন () {ডেটা _ হিডেন;// লুকানো বস্তু ডেটা ডি = * এফ (& _ হিডেন) তৈরি করুন;// ফলাফলটি ডি-তে অনুলিপি করুন যার ফলে ডেটা অবজেক্টটি দুবার অনুলিপি করা হয়। সি + +-এর বিবর্তনের প্রাথমিক পর্যায়ে, একটি ফাংশন থেকে শ্রেণী প্রকারের একটি বস্তুকে দক্ষতার সাথে ফেরত দিতে ভাষার অক্ষমতাকে একটি দুর্বলতা হিসাবে বিবেচনা করা হত। 1991 সালের দিকে, ওয়াল্টার ব্রাইট অনুলিপি হ্রাস করার জন্য একটি কৌশল প্রয়োগ করেছিলেন, কার্যকরভাবে ফাংশনটির ভিতরে লুকানো বস্তু এবং নামযুক্ত বস্তুটিকে ফলাফল ধরে রাখার জন্য ব্যবহৃত বস্তুর সাথে প্রতিস্থাপন করেছিলেনঃ কাঠামো ডেটা {চার বাইট [16];}; অকার্যকর এফ (ডেটা * পি) {// সরাসরি ফলাফল তৈরি করুন * পি} ইন্ট মেইন () {ডেটা ডি; এফ (& ডি);} ব্রাইট তার জর্টেক সি + + সংকলকটিতে এই অপ্টিমাইজেশনটি প্রয়োগ করেছিলেন। এই নির্দিষ্ট কৌশলটি পরে "নামযুক্ত রিটার্ন ভ্যালু অপ্টিমাইজেশন" (এন. আর. ভি. ও) তৈরি করা হয়েছিল, যা একটি নামযুক্ত বস্তুর অনুলিপি বাদ দেওয়ার বিষয়টি উল্লেখ করে। কম্পাইলার সাপোর্ট রিটার্ন ভ্যালু অপ্টিমাইজেশন বেশিরভাগ কম্পাইলারে সমর্থিত। যাইহোক, এমন পরিস্থিতি থাকতে পারে যেখানে সংকলক অপ্টিমাইজেশন সম্পাদন করতে অক্ষম। একটি সাধারণ ঘটনা হল যখন একটি ফাংশন কার্যকর করার পথের উপর নির্ভর করে বিভিন্ন নামযুক্ত বস্তু ফেরত দিতে পারেঃ #include <স্ট্রিং> std:: স্ট্রিং F (bool cond = false) {std:: স্ট্রিং প্রথম ("প্রথম"); std:: স্ট্রিং দ্বিতীয় ("দ্বিতীয়");// ফাংশনটি তার যুক্তির উপর নির্ভর করে দুটি নামযুক্ত বস্তুর মধ্যে একটি ফেরত দিতে পারে। আর. ভি. ও প্রয়োগ করা নাও হতে পারে? প্রথমতঃ দ্বিতীয়;} int প্রধান () {std:: স্ট্রিং ফলাফল = F ();} বাহ্যিক লিঙ্কগুলি cppreference.com রেফারেন্সগুলিতে এলিশন অনুলিপি করুন উদাহরণস্বরূপ সি + + কোড কম্পাইলার অপ্টিমাইজেশান সি + + সহ নিবন্ধগুলি