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