উত্তর:
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
এটি ল্যাভ্যালু রেফারেন্সের ক্ষেত্রে যেমন একটি ঝুঁকির রেফারেন্স দেয়। ফাংশনটি ফিরে আসার পরে অস্থায়ী বস্তুটি ধ্বংস হয়ে যাবে। Beta_ab
নিম্নলিখিত হিসাবে আপনার মান দ্বারা ফিরে আসা উচিত
Beta_ab
Beta::toAB() const {
return Beta_ab(1, 1);
}
এখন, এটি সঠিকভাবে একটি অস্থায়ী Beta_ab
বস্তুকে ফাংশনের রিটার্ন ভ্যালুতে স্থানান্তরিত করছে। সংকলক যদি এটি করতে পারে তবে এটি আরভিও (রিটার্ন মান অপ্টিমাইজেশন) ব্যবহার করে পুরোপুরি সরানো এড়াবে। এখন, আপনি নিম্নলিখিত করতে পারেন
Beta_ab ab = others.toAB();
এবং এটি অস্থায়ীভাবে নির্মাণে সরে যাবে ab
, বা একটি মুভিটি বাদ দেওয়া বা সম্পূর্ণ অনুলিপি করতে আরভিও করবে। আমি আপনাকে বুস্টকন ০৯ এর মূল্যায়ন রেফারেন্স 101 পড়ার পরামর্শ দিচ্ছি যা বিষয়টি ব্যাখ্যা করেছে এবং (এন) আরভিও কীভাবে এর সাথে ইন্টারঅ্যাক্ট করার জন্য ঘটে।
আপনার কোনও মূল্যের রেফারেন্স ফিরিয়ে দেওয়ার ক্ষেত্রে অন্যান্য অনুষ্ঠানের ক্ষেত্রে একটি ভাল ধারণা হবে। কল্পনা করুন যে আপনার একটি getAB()
ফাংশন রয়েছে যা আপনি প্রায়শই একটি অস্থায়ীকে অনুরোধ করেন। এটিকে মূল্যের অস্থায়ী জন্য একটি সমঝোতার মূল্যায়ন রেফারেন্স প্রদান করা অনুকূল নয়। আপনি এটি এভাবে প্রয়োগ করতে পারেন
struct Beta {
Beta_ab ab;
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return move(ab); }
};
মনে রাখবেন যে এক্ষেত্রে alচ্ছিক নয় move
, কারণ ab
এটি স্থানীয় কোনও স্বয়ংক্রিয় বা তাত্পর্যপূর্ণ নয়। এখন, রেফ-কোয়ালিফায়ার &&
বলছে যে দ্বিতীয় ফাংশনটি অনুলিপি অস্থায়ীগুলিতে অনুরোধ করা হয়েছে, অনুলিপি পরিবর্তে নিম্নলিখিত পদক্ষেপ তৈরি করে
Beta_ab ab = Beta().getAB();
এটা তোলে করতে উদাহরণস্বরূপ, আরও দক্ষ হতে একটু ভিন্ন প্রেক্ষাপটে:
template <typename T>
T&& min_(T&& a, T &&b) {
return std::move(a < b? a: b);
}
int main() {
const std::string s = min_(std::string("A"), std::string("B"));
fprintf(stderr, "min: %s\n", s.c_str());
return 0;
}
একটি আকর্ষণীয় পর্যবেক্ষণ হিসাবে, আমার মেশিনে clang++ -O3
নিয়মিত জন্য 62 টি নির্দেশাবলীর বিপরীতে কোডের জন্য 54 টি নির্দেশাবলী উত্পন্ন করে std::min
। তবে -O0
এটির সাথে নিয়মিত 481 বিপরীতে উপরের কোডের জন্য 518 নির্দেশাবলী উত্পন্ন করে std::min
।
for(:)
এবং ডিওলোকটেড অবজেক্টের সাথে একীকরণ করেছেন। স্থির করুন: ideone.com/tQVOal
std::move()
আরও স্পষ্টভাবে পয়েন্টটি চিত্রিত করার জন্য কেবল একটি সুস্পষ্ট কাস্ট হিসাবে ব্যবহৃত হয়। এটি এমন কোনও কোড নয় যা আপনি আপনার প্রকল্পে অনুলিপি করুন। এটি শীর্ষ-ভোট দেওয়া উত্তরের বিরোধিতা করে না, কারণ ফাংশনের অভ্যন্তরে অস্থায়ী বস্তু তৈরি করা হয়। এখানে প্রত্যাবর্তিত অবজেক্ট হ'ল একটি আর্গুমেন্ট (অস্থায়ী বস্তুগুলি সম্পূর্ণ-এক্সপ্রেশনকে মূল্যায়নের শেষ পদক্ষেপ হিসাবে ধ্বংস করা হয় যা (সংক্ষিপ্তভাবে) যেখানে তারা তৈরি হয়েছিল সেই বিন্দুটি রয়েছে)।