স্ট্যাকস আমাদের নিখুঁতভাবে নিবন্ধের সীমাবদ্ধতার সীমাবদ্ধতা বাইপাস করতে অনুমতি দেয় allow
ঠিক 26 গ্লোবালগুলি "রেজিস্টার এজে" আছে (বা এমনকি 8080 চিপের কেবল 7 বাইট-আকারের রেজিস্টার রয়েছে) কল্পনা করুন এবং আপনি এই অ্যাপ্লিকেশনটিতে লিখেছেন এমন প্রতিটি ফাংশন এই সমতল তালিকা ভাগ করে দেয়।
প্রথম কাজটিতে প্রথম কয়েকটি নিবন্ধক বরাদ্দ করা একটি নির্বোধের সূচনা হবে এবং এটি জানতে পেরেছিল যে এটি মাত্র 3 নিয়েছে, দ্বিতীয় ফাংশনের জন্য "ডি" দিয়ে শুরু করুন ... আপনি দ্রুত রান আউট হয়ে যান।
পরিবর্তে, যদি আপনার কাছে ট্যুরিং মেশিনের মতো রূপক টেপ থাকে তবে আপনি প্রতিটি ফাংশনটি টেপটি ব্যবহার করে এবং ফরোয়ার্ড () ফরোয়ার্ড সংরক্ষণ করে "অন্য ফাংশন কল করুন" শুরু করতে পারেন , এবং তারপরে কলি ফাংশনটি অনেকের সাথে বিভ্রান্ত করতে পারে এটি যেমন চান নিবন্ধভুক্ত। কলিটি শেষ হয়ে গেলে, এটি প্যারেন্ট ফাংশনে নিয়ন্ত্রণ ফিরিয়ে দেয়, যিনি প্রয়োজন অনুসারে কলির আউটপুট কোথায় ছিনিয়ে নিতে জানেন এবং তার অবস্থার পুনরুদ্ধার করতে টেপটি পিছনের দিকে খেলেন।
আপনার বেসিক কল ফ্রেমটি কেবল এটিই এবং মানকযুক্ত মেশিন কোড সিকোয়েন্সগুলি তৈরি করে ফেলে দেওয়া হয় এবং সংকলকটি একটি ফাংশন থেকে অন্য ক্রমে রূপান্তরগুলি রাখে। (আমার সি স্ট্যাক ফ্রেমগুলি মনে রাখার পরে অনেক দিন হয়ে গেছে, তবে এক্স ৮86_ক্যালিং_ কনভেনশনগুলিতে কে কী কমেছে তার দায়িত্বগুলি বিভিন্ন উপায়ে আপনি পড়তে পারেন ))
(পুনরাবৃত্তি দুর্দান্ত, তবে আপনি যদি কখনও স্ট্যাক ছাড়াই রেজিস্টারগুলিকে জাগ্রত করতে চান, তবে আপনি সত্যিই স্ট্যাকের প্রশংসা করবেন))
আমি মনে করি প্রোগ্রামটি সঞ্চয় করতে এবং এর সংকলন সমর্থন করার জন্য প্রয়োজনীয় বর্ধিত হার্ড ডিস্কের স্থান এবং র্যাম (যথাক্রমে) আমরা কল স্ট্যাকগুলি ব্যবহার করার কারণ। এটা কি ঠিক?
যদিও আমরা এই দিনগুলিতে আরও ইনলাইন করতে পারি, ("আরও গতি" সর্বদা ভাল; ভিডিও স্ট্রিমের জগতে "কম কেবি" অর্থ হল ") মূল সীমাবদ্ধতা নির্দিষ্ট ধরণের কোড নিদর্শনগুলিতে সমতল করার সংকলকটির দক্ষতার মধ্যে রয়েছে।
উদাহরণস্বরূপ, পলিমার্ফিক অবজেক্টস - আপনি যদি একমাত্র এবং কেবলমাত্র এক ধরণের অবজেক্টকে আপনাকে হস্তান্তরিত না করেন তবে আপনি সমতল করতে পারবেন না; আপনাকে অবজেক্টের vtable এর বৈশিষ্ট্যগুলি দেখতে হবে এবং সেই পয়েন্টারের মাধ্যমে কল করতে হবে ... রানটাইম করতে তুচ্ছ, সংকলনের সময় ইনলাইন করা অসম্ভব।
একটি আধুনিক সরঞ্জামচাঁটি আনন্দের সাথে বহুবর্ষগতভাবে সংজ্ঞায়িত ফাংশনটি ইনলাইন করতে পারে যখন এটি কলার (গুলি) পর্যাপ্ত পরিমাণে চ্যাপ্টা করে জানবে ঠিক কী বস্তুর স্বাদটি:
class Base {
public: void act() = 0;
};
class Child1: public Base {
public: void act() {};
};
void ActOn(Base* something) {
something->act();
}
void InlineMe() {
Child1 thingamabob;
ActOn(&thingamabob);
}
উপরের দিক থেকে, সংকলকটি ইনলাইনমে থেকে অভ্যন্তরীণ আইন () এর যা কিছু আছে তার মাধ্যমে ডানদিকে রাখার জন্য বা রানটাইমের সময় কোনও ভ্যাটবেল স্পর্শ করার প্রয়োজন নেই।
তবে একই ফাংশনের আরও কিছু অনুরোধ অন্তর্ভুক্ত থাকলেও কোনও কিছুর অনিশ্চয়তার কারণে এটি কোনও স্বতন্ত্র ফাংশনকে কল হিসাবে ছেড়ে দেবে ।