নিম্নলিখিত একক সংযুক্ত তালিকার প্রয়োগ বিবেচনা করুন:
struct node {
std::unique_ptr<node> next;
ComplicatedDestructorClass data;
}
এখন, ধরুন আমি std::unique_ptr<node> head
এমন কোনও উদাহরণ ব্যবহার করা বন্ধ করে দিয়েছি যা এরপরে সুযোগের বাইরে চলে যায়, যার ফলে এটি ধ্বংসকারীকে ডাকা হয়।
এটি যথেষ্ট পরিমাণে বড় তালিকার জন্য আমার স্ট্যাককে আঘাত করবে? অনুমান করা কি ন্যায়সঙ্গত যে সংকলকটি একটি জটিল জটিল অপ্টিমাইজেশন করবে (ইনলাইন unique_ptr
এর ডেস্ট্রাক্টর এর মধ্যে node
, তারপরে পুনরাবৃত্তিটি ব্যবহার করুন), যা নিম্নলিখিতগুলি করা হলে আরও শক্ত হয়ে যায় (যেহেতু data
বিনষ্টকারী next
এটিকে শক্ত করে তোলে) সংকলকটির জন্য সম্ভাব্য পুনঃক্রম এবং টেল কলের সুযোগটি লক্ষ্য করার জন্য):
struct node {
std::shared_ptr<node> next;
ComplicatedDestructorClass data;
}
যদি data
কোনওভাবে এর কোনও পয়েন্টার থাকে node
তবে এটি লেজ পুনরূদ্ধার জন্যও অসম্ভব হতে পারে (যদিও অবশ্যই এ্যাঙ্ক্যাপেসুলেশনের এ জাতীয় লঙ্ঘন এড়াতে আমাদের চেষ্টা করা উচিত)।
সাধারণভাবে, অন্যথায় কীভাবে এই তালিকাটি ধ্বংস করার কথা? আমরা তালিকাটি পেরিয়ে "বর্তমান" নোডটি মুছতে পারি না কারণ ভাগ করে নেওয়া পয়েন্টারে একটি নেই release
! একমাত্র উপায় হ'ল একটি কাস্টম মোছার সাথে, যা আমার কাছে সত্যই দুর্গন্ধযুক্ত।
gcc -O3
একটি পুচ্ছ পুনরাবৃত্তি (জটিল উদাহরণে) অনুকূল করতে পারেনি।