মূল্যসূচক রেফারেন্স দিয়ে ফিরে আসা কি আরও দক্ষ?


উত্তর:


246
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();

51
আমি সবসময় ধরেই নিয়েছিলাম যে ঝুঁকিপূর্ণ রেফারেন্স সমস্যাটি স্বয়ংক্রিয়ভাবে চলে গেছে যখন রিটার্নের ধরণটি কোনও আর-মান রেফারেন্স হয়। খুশী হ'ল এটি আমাকে বিট করার আগেই আমি সোজা হয়ে গেলাম। স্ট্যাক স্ম্যাশিং বাগ স্তন্যপান।
def_code

31
:) সত্যিই, মূল্য সংক্রান্ত তথ্যসূত্রগুলি হল "কেবলমাত্র রেফারেন্স" যেমন লভ্যালু রেফারেন্সগুলি। তারা কিছু অনুলিপি বা সঞ্চয় করে না।
জোহানেস স্কাউব -

9
কোন সদস্যের কনস্ট এবং কোয়ালিফায়ার কী সাধারণ কনস্টের চেয়ে বেশি কাজ করে?
গ্যালিনেট


3

2

এটা তোলে করতে উদাহরণস্বরূপ, আরও দক্ষ হতে একটু ভিন্ন প্রেক্ষাপটে:

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


আমি আপনার উত্তর দ্বারা বিভ্রান্ত একটি অনুরূপ (সম্ভবত) সংস্করণ চেষ্টা করেও ব্যর্থ হয়েছে: ideone.com/4GyUbZ আপনি কেন ব্যাখ্যা করতে পারেন?
Deqing

আপনি অস্থায়ী অবজেক্টের মধ্যে রেফারেন্স ব্যবহার করেছেন for(:)এবং ডিওলোকটেড অবজেক্টের সাথে একীকরণ করেছেন। স্থির করুন: ideone.com/tQVOal
আশ্চর্য.মিস

3
এই উত্তর আসলে ভুল না? প্যারামিটার টি, টি টেমপ্লেটের জন্য && হয় না একটি r- মান রেফারেন্স, বরং একটি সার্বজনীন রেফারেন্স, এবং যে ক্ষেত্রে জন্য, আমরা উচিত সবসময় কল এসটিডি :: এগিয়ে <টি>, না std :: পদক্ষেপ! উল্লেখ করার মতো নয় যে এই উত্তরটি উপরের শীর্ষে-ভোট দেওয়া একজনের সাথে সরাসরি বিরোধিতা করে।
xdavidliu

@ এক্সডাভিডলিউ এই উত্তরটি কীভাবে মূল্যবোধের মাধ্যমে ফিরে আসা আরও কার্যকর হতে পারে তা একটি স্বতন্ত্র উদাহরণ। std::move()আরও স্পষ্টভাবে পয়েন্টটি চিত্রিত করার জন্য কেবল একটি সুস্পষ্ট কাস্ট হিসাবে ব্যবহৃত হয়। এটি এমন কোনও কোড নয় যা আপনি আপনার প্রকল্পে অনুলিপি করুন। এটি শীর্ষ-ভোট দেওয়া উত্তরের বিরোধিতা করে না, কারণ ফাংশনের অভ্যন্তরে অস্থায়ী বস্তু তৈরি করা হয়। এখানে প্রত্যাবর্তিত অবজেক্ট হ'ল একটি আর্গুমেন্ট (অস্থায়ী বস্তুগুলি সম্পূর্ণ-এক্সপ্রেশনকে মূল্যায়নের শেষ পদক্ষেপ হিসাবে ধ্বংস করা হয় যা (সংক্ষিপ্তভাবে) যেখানে তারা তৈরি হয়েছিল সেই বিন্দুটি রয়েছে)।
আশ্চর্য.মাইস

2
@ আশ্চর্য.মাইস তারপর স্ট্যান্ড :: স্ট্রিং দিয়ে টি প্রতিস্থাপন করুন; এখানে এখানে টেমপ্লেটগুলি ব্যবহার করার দরকার নেই এবং টি-এন্ড & রকে একটি মূল্যবান রেফারেন্স হিসাবে ব্যবহার করা কেবলমাত্র ভয়াবহ শৈলী যা অকারণে লোকেদের টেম্পলেট এবং আর-মানগুলিতে বিভ্রান্ত করে।
xdavidliu
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.