سال نو مبارک ...
سلام
همون طور که می دونید به طور کلی حافظه به سه بخش تقسیم می شه
بخش اول همون کد کامپایل شده برنامه (text (code) segment)
بخش دوم حافظه متغیرهای اتوماتیک، توابع و یا دیتا (stack segment)
بخش سوم حافظه داینامیک برنامه (heap segment)
HeapAndStack.png
----------------------------------------------------------------------------------------
اصلاح مطلب بالا : طبق این لینک و بحث هایی که در ادامه شد
Program memory
The computer program memory is organized into the following
Data Segment :: Data + BSS + Heap
Stack
Code segment
--------------------------------------------------------------------------------------------------------
سوال اول و مهمترین سوال من) متغیرها، اشیاء و توابعی که به صورت ( global و به خصوص static) تعریف می شوند، فکر می کنم در بخش دوم یعنی stack ذخیره می شن، حالا می خوام بدونم این ذخیره سازی به چه نحوی صورت می گیره، یعنی یک متغیر سراسری (global یا یک متغیر static) پس از فراخوانی تابع اصلی برنامه (main) توسط سیستم و قرار گرفتن main در stack ، کجا و به چه نحوی ذخیره می شه؟(static stack storage)
سوال دوم) حافظه ای که به صورت استاتیک(static) و یا سراسری(global) دریافت شده رو، اگر بخوایم در طول برنامه به سیستم برگردونیم باید چه طوری عمل کنیم؟اصلا امکانش هست؟
سوال سوم) اختصاص و حذف حافظه داینامیک فقط و فقط توسط new , delete صورت خواهد پذیرفت؟بهتر بگم چگونه بدون استفاده از new میشه چیزی رو در heap قرار داد مانند تابع calcSize در تصویر بالا؟
سوال چهارم) متغیرها، اشیاء و توابع ثابت (const) هم در بخش stack ذخیره می شوند؟ و آیا مشابه متغیرهای اتوماتیک با آن ها برخورد خواهد شد؟
سوال پنجم) حتما اولین چیزی که در حافظه قرار می گیرد و آخرین چیزی که از حافظه حذف می شه تابع main است؟ (LIFO-Last In First Out) (یعنی حتی متغیر های سراسری هم بعد از main در حافظه قرار می گیرند و خارج می شوند) و اما در آخر فراخوانی و نگهداری دائم تابع main در برنامه توسط چه بخشی صورت می گیرد؟کامپایلر؟
تشکر