@ জডিডুগোসজে মন্তব্যগুলিতে যেমন উল্লেখ করেছেন, হার্ব আরেকটি পরামর্শ দিয়েছেন (পরে?) কথা বলার জন্য, এখান থেকে মোটামুটি দেখুন: https://youtu.be/xnqTKD8uD64?t=54m50s ।
তার পরামর্শটি কেবলমাত্র এমন ফাংশনের জন্য মান পরামিতিগুলি ব্যবহার করে f
যা এই ডুবে আর্গুমেন্টগুলি থেকে আপনি নির্মাণ সরিয়ে নিয়ে যাবেন বলে ধরে নেওয়া যায় ink
এই সাধারণ পদ্ধতিটি f
যথাক্রমে ল্যাভেলু এবং রাল্যু যুক্তিগুলির অনুকূলতর প্রয়োগের তুলনায় লভালু এবং মূল্যমান উভয় যুক্তির জন্য একটি মুভ কনস্ট্রাক্টরের ওভারহেড যুক্ত করে । কেন এটি হয় তা দেখার জন্য, ধরুন f
একটি মান প্যারামিটার লাগে, যেখানে T
কিছু অনুলিপি থাকে এবং গঠনমূলক ধরণের স্থানান্তরিত হয়:
void f(T x) {
T y{std::move(x)};
}
f
লভ্যালু আর্গুমেন্টের সাথে কল করার ফলে একটি অনুলিপি নির্মাণকারীকে নির্মাণের জন্য ডাকা হবে x
এবং একটি মুভ কনস্ট্রাক্টরকে নির্মাণের জন্য ডাকা হবে y
। অন্যদিকে, f
কোনও মূল্যের আর্গুমেন্টের সাথে কল করার ফলে একজন মুভ কনস্ট্রাক্টরকে নির্মাণের জন্য ডেকে আনতে হবে x
এবং অন্য একটি মুভ কনস্ট্রাক্টরকে নির্মাণের জন্য ডাকা হবে y
।
সাধারণভাবে, f
লভালু আর্গুমেন্টের সর্বোত্তম বাস্তবায়ন নিম্নরূপ:
void f(const T& x) {
T y{x};
}
এই ক্ষেত্রে, কেবলমাত্র একটি অনুলিপি নির্মাণকারীকে নির্মাণ করতে বলা হয় y
। f
যথাযথ আর্গুমেন্টের সর্বোত্তম বাস্তবায়নটি আবার সাধারণভাবে নিম্নরূপ:
void f(T&& x) {
T y{std::move(x)};
}
এই ক্ষেত্রে, শুধুমাত্র একটি মুভ কনস্ট্রাক্টরকে কনস্ট্রাক্ট করার জন্য ডাকা হয় y
।
সুতরাং একটি বুদ্ধিমান সমঝোতা হ'ল একটি মান প্যারামিটার গ্রহণ করা এবং সর্বোত্তম বাস্তবায়নের ক্ষেত্রে লভালু বা মূল্যবান যুক্তিগুলির জন্য একটি অতিরিক্ত পদক্ষেপের কনস্ট্রাক্টর কল করা, যা হার্বের আলোচনায় দেওয়া পরামর্শও।
@ জেডিগোগস মন্তব্যগুলিতে যেমন উল্লেখ করেছেন যে, মান দ্বারা পাস করা কেবল এমন ফাংশনগুলির জন্য অর্থবোধ করে যা ডুবে আর্গুমেন্ট থেকে কিছু বস্তু তৈরি করবে। যখন আপনার কোনও ফাংশন রয়েছে f
যা তার যুক্তিটি অনুলিপি করে, তখন পাস-বাই-মান পদ্ধতির একটি সাধারণ পাস বাই কনস্ট-রেফারেন্স পদ্ধতির চেয়ে বেশি ওভারহেড থাকবে। কোনও ফাংশনের পাস-বাই-ভ্যালু পদ্ধতির f
যা তার প্যারামিটারের একটি অনুলিপি ধরে রেখেছে তার ফর্মটি থাকবে:
void f(T x) {
T y{...};
...
y = std::move(x);
}
এই ক্ষেত্রে, একটি অনুলিপি নির্মাণের জন্য একটি মূল্যবান আর্গুমেন্টের জন্য একটি অনুলিপি নির্মাণ এবং একটি মুভ নির্মাণ এবং মূল্যের আর্গুমেন্টের জন্য সরানো অ্যাসাইনমেন্ট রয়েছে। লভ্যালু আর্গুমেন্টের জন্য সর্বাধিক অনুকূল কেসটি হ'ল:
void f(const T& x) {
T y{...};
...
y = x;
}
এটি কেবলমাত্র একটি অ্যাসাইনমেন্টে ফোটে, যা কপিরাইট কনস্ট্রাক্টর প্লাস-বাই-ভ্যালু পদ্ধতির জন্য প্রয়োজনীয় মুভ অ্যাসাইনমেন্টের চেয়ে সম্ভাব্য অনেক কম। এর কারণ হ'ল অ্যাসাইনমেন্টটি বিদ্যমান বরাদ্দকৃত মেমরিটিকে পুনরায় ব্যবহার করতে পারে y
এবং তাই (ডি) বরাদ্দকে আটকাতে পারে, তবে অনুলিপি নির্মাণকারী সাধারণত মেমরি বরাদ্দ করে।
কোনও মূল্যায়িত যুক্তির জন্য সর্বাধিক অনুকূল বাস্তবায়নের জন্য f
একটি অনুলিপিটি ফর্মটি ধারণ করে:
void f(T&& x) {
T y{...};
...
y = std::move(x);
}
সুতরাং, এই ক্ষেত্রে কেবল একটি সরানো কার্য এর সংস্করণে কোনও মূল্য পাস করাতে কনস্টের f
রেফারেন্স লাগে কেবল স্থানান্তরের অ্যাসাইনমেন্টের পরিবর্তে একটি অ্যাসাইনমেন্টের জন্য। তুলনামূলকভাবে বলতে গেলে, f
সাধারণ প্রয়োগ হিসাবে এই ক্ষেত্রে একটি দৃ const় রেফারেন্স নেওয়ার সংস্করণটি পছন্দনীয়।
সুতরাং সাধারণভাবে, সর্বাধিক অনুকূল বাস্তবায়নের জন্য, আলাপে প্রদর্শিত হিসাবে আপনাকে ওভারলোড বা এক ধরণের নিখুঁত ফরোয়ার্ডিং করতে হবে। ত্রুটিটি প্রয়োজনীয় ওভারলোডের সংখ্যার একটি সংহত বিস্ফোরণ, প্যারামিটারের সংখ্যার উপর নির্ভর করে f
যদি আপনি আর্গুমেন্টের মান বিভাগে ওভারলোড বেছে নেন। পারফেক্ট ফরওয়ার্ডিংয়ের f
একটি অপূর্ণতা রয়েছে যা একটি টেম্পলেট ফাংশনে পরিণত হয়, যা এটি ভার্চুয়াল তৈরি করতে বাধা দেয় এবং আপনি যদি এটি 100% ডান পেতে চান তবে উল্লেখযোগ্যভাবে আরও জটিল কোডের ফলাফল হয় (গোরীর বিশদগুলির জন্য আলাপ দেখুন)।