সাধারণভাবে সেরা অনুশীলনের সুপারিশ হত 1 থেকে জন্য const সুত্র দ্বারা ব্যবহারের পাস সব ধরনের , ধরনের (builtin ছাড়া char
, int
, double
, ইত্যাদি), iterators জন্য এবং ফাংশন অবজেক্টের জন্য (lambdas থেকে আহরিত শ্রেণীর std::*_function
)।
মুভ শব্দার্থবিদ্যার অস্তিত্বের আগে এটি বিশেষত সত্য ছিল । কারণটি সহজ: আপনি যদি মান দিয়ে পাস করেন তবে অবজেক্টের একটি অনুলিপি তৈরি করতে হয়েছিল এবং খুব ছোট বস্তুগুলি বাদে, রেফারেন্স পাস করার চেয়ে এটি সর্বদা ব্যয়বহুল।
সি ++ 11 এর সাথে আমরা মুভ সিমানটিকস অর্জন করেছি । সংক্ষেপে, শব্দার্থবিজ্ঞানের অনুমতিটি স্থানান্তর করুন যে কোনও কোনও ক্ষেত্রে কোনও বস্তু অনুলিপি না করেই "মান দ্বারা" পাস করা যায়। বিশেষত, এটি তখন ঘটে যখন আপনি যে অবজেক্টটি দিয়ে যাচ্ছেন সেটি কোনও মূল্য রয়েছে ।
নিজেই, কোনও বস্তুকে সরিয়ে নেওয়া এখনও উল্লেখ হিসাবে পাস করার মতো কমপক্ষে ব্যয়বহুল। যাইহোক, অনেক ক্ষেত্রে কোনও ফাংশন অভ্যন্তরীণভাবে যে কোনও উপায়ে অনুলিপি করবে - যেমন এটি যুক্তির মালিকানা গ্রহণ করবে । 2
এই পরিস্থিতিতে আমাদের নিম্নলিখিত (সরলীকৃত) বাণিজ্য বন্ধ রয়েছে:
- আমরা রেফারেন্স দ্বারা অবজেক্টটি পাস করতে পারি, তারপরে অভ্যন্তরীণভাবে অনুলিপি করতে পারি।
- আমরা মান দিয়ে বস্তুটি পাস করতে পারি।
"মান দ্বারা পাস" এখনও অবজেক্টটি অনুলিপি করে তোলে, যদি না অবজেক্টটির মূল্য হয়। কোনও মূল্যমানের ক্ষেত্রে, বস্তুটি পরিবর্তে সরানো যেতে পারে, যাতে দ্বিতীয় কেস হঠাৎ করে "অনুলিপি না করে, পরে সরান" তবে "সরান, তারপরে (সম্ভাব্য) আবার সরানো হবে"।
সঠিক পদক্ষেপের কনস্ট্রাক্টর (যেমন ভেক্টর, স্ট্রিংস ...) বাস্তবায়িত করে এমন বড় অবজেক্টগুলির জন্য, দ্বিতীয় কেসটি প্রথমটির চেয়ে তারপরে আরও কার্যকর। সুতরাং, যদি ফাংশনটি আর্গুমেন্টের মালিকানা গ্রহণ করে এবং অবজেক্টের ধরণের দক্ষ চালিতিকে সমর্থন করে তবে মান দ্বারা পাস ব্যবহার করার পরামর্শ দেওয়া হয় ।
একটি noteতিহাসিক নোট:
প্রকৃতপক্ষে, কোনও আধুনিক সংকলককে মূল্য দিয়ে যাওয়ার সময় ব্যয় করার পরে তা নির্ণয় করতে সক্ষম হওয়া উচিত এবং সম্ভব হলে কলটিকে কনস্টের রেফ ব্যবহারের জন্য স্পষ্টভাবে রূপান্তরিত করতে হবে।
ধারণায়. অনুশীলনে, সংকলকগণ ফাংশনের বাইনারি ইন্টারফেসটি না ভেঙে সর্বদা এটি পরিবর্তন করতে পারে না। কিছু বিশেষ ক্ষেত্রে (যখন ফাংশনটি ইনলাইন করা হয়) অনুলিপিটি প্রকৃতপক্ষে আলাদা করা হয় যদি সংকলকটি বুঝতে পারেন যে ফাংশনের ক্রিয়াকলাপের মাধ্যমে মূল অবজেক্টটি পরিবর্তন করা যাবে না।
তবে সাধারণভাবে সংকলক এটি নির্ধারণ করতে পারে না, এবং সি ++ এ মুভ সিমানটিক্সের আবিষ্কারটি এই অপ্টিমাইজেশনটিকে অনেক কম প্রাসঙ্গিক করেছে।
স্কট মেয়ার্সে 1 উদাহরণস্বরূপ, কার্যকর সি ++ ।
2 এটি প্রায়শই অবজেক্ট কনস্ট্রাক্টরদের ক্ষেত্রে সত্য, যা আর্গুমেন্ট নিতে পারে এবং এগুলি অভ্যন্তরীণভাবে নির্ধারিত অবজেক্টের রাজ্যের অংশ হতে পারে store