আপনি যে কোডটি লিখেছেন তার সঠিকতা কখনই কোনও অপ্টিমাইজেশানের উপর নির্ভর করে না । তারা নির্দিষ্টকরণে ব্যবহার করেন এমন সি ++ "ভার্চুয়াল মেশিন" এ কার্যকর করা হলে সঠিক ফলাফলটি আউটপুট করা উচিত।
তবে, আপনি যে বিষয়ে কথা বলছেন তা হ'ল দক্ষতার ধরণের প্রশ্ন। আপনার কোডটি আরভিও অনুকূলিতকরণ সংকলক দিয়ে অনুকূলিত হলে আরও ভাল চলে। এটি ঠিক আছে, সমস্ত কারণের জন্য অন্যান্য উত্তরগুলিতে নির্দেশিত।
তবে, যদি আপনার প্রয়োজন হয় এই অপ্টিমাইজেশানটির (যেমন যদি অনুলিপি নির্মাণকারী আপনার কোডটি আসলে ব্যর্থ করে দেয়), এখন আপনি সংকলকটির পছন্দ অনুসারে।
আমার নিজের অনুশীলনে এর সর্বোত্তম উদাহরণটি হ'ল লেজ কল অপ্টিমাইজেশন:
int sillyAdd(int a, int b)
{
if (b == 0)
return a;
return sillyAdd(a + 1, b - 1);
}
এটি একটি নির্বোধ উদাহরণ, তবে এটি একটি লেজ কল দেখায়, যেখানে কোনও ফাংশন শেষে ফাংশনটির শেষে ডানদিকে পুনরাবৃত্তভাবে ডাকা হয়। সি ++ ভার্চুয়াল মেশিনটি দেখিয়ে দেবে যে এই কোডটি সঠিকভাবে পরিচালিত হচ্ছে, যদিও আমি প্রথমে কেন এমন একটি অতিরিক্ত রুটিন লিখতে কেন বিরক্ত করেছি তা নিয়ে আমি একটু বিভ্রান্তি সৃষ্টি করতে পারি । তবে, সি ++ এর ব্যবহারিক বাস্তবায়নে আমাদের একটি স্ট্যাক রয়েছে এবং এর সীমিত জায়গা রয়েছে। পেডেন্টালিভাবে করা হয়ে গেলে, এই ক্রিয়াকলাপটি কমপক্ষে b + 1
স্ট্যাক ফ্রেমগুলিকে স্ট্যাকের সাথে যুক্ত করতে হবে কারণ এটি এর সংযোজন করে। আমি যদি গণনা করতে চাই sillyAdd(5, 7)
তবে এটি কোনও বড় বিষয় নয়। আমি যদি গণনা করতে চাই তবে আমি sillyAdd(0, 1000000000)
স্ট্যাকওভারফ্লো (এবং ভাল ধরণের নয় ) সৃষ্টিতে প্রকৃত সমস্যায় পড়তে পারি ।
তবে, আমরা দেখতে পাচ্ছি যে একবার আমরা শেষ রিটার্ন লাইনে পৌঁছালে আমরা বর্তমান স্ট্যাক ফ্রেমের সমস্ত কিছু দিয়ে সত্যই সম্পন্ন করেছি। আমাদের এটিকে আশেপাশে রাখার দরকার নেই। টেইল কল অপ্টিমাইজেশন আপনাকে পরবর্তী ফাংশনের জন্য বিদ্যমান স্ট্যাক ফ্রেমটিকে "পুনরায়" ব্যবহার করতে দেয়। এইভাবে, আমাদের চেয়ে কেবল 1 টি স্ট্যাক ফ্রেম দরকার b+1
। (আমাদের এখনও এই সমস্ত মূ addition় সংযোজন এবং বিয়োগগুলি করতে হবে, তবে তারা বেশি জায়গা নেয় না)) কার্যত, অপ্টিমাইজেশন কোডটিকে এই রূপে পরিণত করে:
int sillyAdd(int a, int b)
{
begin:
if (b == 0)
return a;
// return sillyAdd(a + 1, b - 1);
a = a + 1;
b = b - 1;
goto begin;
}
কিছু ভাষায়, লেজ কল অপ্টিমাইজেশন স্পষ্টভাবে স্পেসিফিকেশন প্রয়োজন হয়। সি ++ হয় না একটিও । আমি এই টেল কল অপটিমাইজেশন সুযোগটি স্বীকৃতি দিতে সি ++ সংকলকগুলির উপর নির্ভর করতে পারি না, যদি না আমি কেস-কেস-কেস না যাই go আমার ভিজ্যুয়াল স্টুডিওর সংস্করণ সহ, রিলিজ সংস্করণটি লেজ কল অপ্টিমাইজেশন করে, তবে ডিবাগ সংস্করণটি (নকশা অনুসারে) করে না।
সুতরাং আমার পক্ষে গণনা করতে সক্ষম হওয়ার উপর নির্ভর করা খারাপ হবে sillyAdd(0, 1000000000)
।