মান অনুসারে স্মার্ট পয়েন্টার ফিরিয়ে দিন।
যেমনটি আপনি বলেছেন, আপনি যদি রেফারেন্স দিয়ে এটি ফিরিয়ে দেন তবে আপনি যথাযথভাবে রেফারেন্স গণনাটি বাড়িয়ে তুলবেন না, যা অনুপযুক্ত সময়ে কিছু মুছার ঝুঁকি উন্মুক্ত করে। রেফারেন্স দিয়ে ফিরে না আসার যথেষ্ট কারণ এটিই হওয়া উচিত। ইন্টারফেস শক্তিশালী হওয়া উচিত।
মূল্য উদ্বেগ আজকাল মান অপ্টিমাইজেশনের (আরভিও) ধন্যবাদ জানাতে পারে, সুতরাং আপনি আধুনিক বর্ধকগুলির মধ্যে কোনও ইনক্রিমেন্ট-ইনক্রিমেন্ট-হ্রাস ক্রম বা এ জাতীয় কিছু ব্যয় করবেন না। সুতরাং কোনও ফেরতের সর্বোত্তম উপায় shared_ptr
হ'ল মূল্য দিয়ে ফিরে আসা:
shared_ptr<T> Foo()
{
return shared_ptr<T>();
};
এটি আধুনিক সি ++ সংকলকগুলির জন্য একটি মৃত-সুস্পষ্ট আরভিও সুযোগ। আমি একটি বাস্তবতার জন্য জানি যে সমস্ত অপ্টিমাইজেশন বন্ধ থাকলেও ভিজ্যুয়াল সি ++ সংকলকরা আরভিও প্রয়োগ করে। এবং সি ++ 11 এর পদক্ষেপ শব্দার্থক শব্দগুলির সাথে, এই উদ্বেগটি আরও কম প্রাসঙ্গিক। (তবে নিশ্চিত হওয়ার একমাত্র উপায় হ'ল প্রোফাইল এবং পরীক্ষা)
আপনি যদি এখনও নিশ্চিত না হন, ডেভ আব্রাহামসের একটি নিবন্ধ আছে যা মান দিয়ে ফেরার জন্য একটি তর্ক করে। আমি এখানে একটি স্নিপেট পুনরুত্পাদন; আমি আপনাকে সুপারিশ করছি যে আপনি পুরো নিবন্ধটি পড়ুন:
সত্যবাদী হোন: নীচের কোডটি আপনাকে কীভাবে অনুভব করে?
std::vector<std::string> get_names();
...
std::vector<std::string> const names = get_names();
সত্যি বলতে, যদিও আমার আরও ভাল জানা উচিত, এটি আমাকে নার্ভাস করে তোলে। বস্তুত, যখন get_names()
আয়, আমরা একটি কপি করতে vector
এর string
গুলি। তারপরে, যখন আমরা আরম্ভ করব তখনই এটি আবার অনুলিপি করা
names
দরকার এবং আমাদের প্রথম অনুলিপিটি নষ্ট করতে হবে। যদি string
ভেক্টরে এন থাকে তবে প্রতিটি অনুলিপিটির জন্য N + 1 মেমরির বরাদ্দ এবং ক্যাশে-বন্ধুত্বপূর্ণ ডেটা অ্যাক্সেসগুলি সম্পূর্ণ> যেমন স্ট্রিংয়ের বিষয়বস্তু অনুলিপি করা হতে পারে।
এই ধরণের উদ্বেগের মুখোমুখি হওয়ার পরিবর্তে অযথা অনুলিপিগুলি এড়াতে আমি প্রায়শই পাস-বাই-রেফারেন্সে ফিরে যাই:
get_names(std::vector<std::string>& out_param );
...
std::vector<std::string> names;
get_names( names );
দুর্ভাগ্যক্রমে, এই পদ্ধতির আদর্শ থেকে দূরে।
- কোডটি 150% দ্বারা বৃদ্ধি পেয়েছে
- আমাদের
const
নাম বাদ দিতে হবে কারণ আমাদের নাম বাদ দিতে হয়েছিল ।
- ফাংশনাল প্রোগ্রামাররা যেমন আমাদের মনে করিয়ে দিতে চায়, মিউটেশন কোডটিকে আরও জটিল করে তোলে রেফারেন্টাল স্বচ্ছতা এবং সমীকরণীয় যুক্তি তল্লাশী করে about
- নামের জন্য আর আমাদের কাছে কঠোর মান শব্দার্থক শব্দ নেই।
তবে দক্ষতা অর্জনের জন্য কি আমাদের কোডটি এইভাবে জগাখিচু করা দরকার? ভাগ্যক্রমে, উত্তরটি হ'ল না (এবং বিশেষত যদি আপনি সি ++ 0x ব্যবহার করেন না)।