আপনার মান দ্বারা ফিরে আসা উচিত।
মান দ্বারা প্রত্যাবর্তনের দক্ষতা উন্নত করতে স্ট্যান্ডার্ডটির একটি নির্দিষ্ট বৈশিষ্ট্য রয়েছে। একে বলা হয় "অনুলিপি এলিজেন", এবং আরও বিশেষত এই ক্ষেত্রে "নামযুক্ত রিটার্ন মান অপ্টিমাইজেশন (এনআরভিও)"।
কম্পাইলার তা বাস্তবায়ন করতে হবে না, কিন্তু তারপর আবার কম্পাইলার না আছে ইনলাইনিং ফাংশন বাস্তবায়ন (অথবা আদৌ কোনো অপ্টিমাইজেশান সঞ্চালন)। সংকলকগণ অনুকূলিত না হলে স্ট্যান্ডার্ড লাইব্রেরিগুলির কার্য সম্পাদন বেশ খারাপ হতে পারে এবং সমস্ত গুরুতর সংকলক ইনলাইনিং এবং এনআরভিও (এবং অন্যান্য অপ্টিমাইজেশান) প্রয়োগ করে।
যখন এনআরভিও প্রয়োগ করা হয়, নিম্নলিখিত কোডটিতে কোনও অনুলিপি থাকবে না:
std::vector<int> f() {
std::vector<int> result;
... populate the vector ...
return result;
}
std::vector<int> myvec = f();
তবে ব্যবহারকারী এটি করতে চাইতে পারেন:
std::vector<int> myvec;
... some time later ...
myvec = f();
অনুলিপি এলিজেন একটি অনুলিপি এখানে প্রতিরোধ করে না কারণ এটি একটি সূচনা চেয়ে বরং একটি কার্যভার। যাইহোক, আপনি এখনও উচিত মান দ্বারা ফিরে আসা । সি ++ ১১-এ, অ্যাসাইনমেন্টটি আলাদা কিছু দ্বারা অনুকূলিত করা হয়, "মুভ সেমেন্টিকস" called সি ++ তে, উপরের কোডটি একটি অনুলিপি সৃষ্টি করে এবং তাত্ত্বিকভাবে একটি অপ্টিমাইজার এটিকে এড়াতে সক্ষম হতে পারে তবে অনুশীলনে এটি খুব কঠিন। সুতরাং পরিবর্তে myvec = f()
, C ++ 03 এ আপনার এটি লেখা উচিত:
std::vector<int> myvec;
... some time later ...
f().swap(myvec);
আরও একটি বিকল্প রয়েছে, যা ব্যবহারকারীকে আরও নমনীয় ইন্টারফেসের প্রস্তাব দেয়:
template <typename OutputIterator> void f(OutputIterator it) {
... write elements to the iterator like this ...
*it++ = 0;
*it++ = 1;
}
এরপরে আপনি তার উপরে বিদ্যমান ভেক্টর-ভিত্তিক ইন্টারফেসটিকে সমর্থন করতে পারেন:
std::vector<int> f() {
std::vector<int> result;
f(std::back_inserter(result));
return result;
}
এটি আপনার বিদ্যমান কোডের চেয়ে কম দক্ষ হতে পারে, যদি আপনার বিদ্যমান কোডটি reserve()
কোনও নির্দিষ্ট পরিমাণের সামনের চেয়ে আরও জটিল উপায়ে ব্যবহার করে। তবে যদি আপনার বিদ্যমান কোডটি মূলত push_back
ভেক্টরকে বারবার কল করে, তবে এই টেমপ্লেট-ভিত্তিক কোডটি তত ভাল হওয়া উচিত।
f
?