وضعیت حافظه در استفاده از کلاس
شاید برای اینکه بتوانم سوالم را خوب مطرح کنم باید یکمی توضیحات بدهم.
ما دو بخش حافظه اصلی داریم که بعد از کامپایل اطلاعات اطلاعات در آن قرار می گیرد:
- حافظه ی Code
- حافظه ی Data
حافظه ی Code به حافظه ی RO و Text. نیز معروف است.
حافظه ی Data که به RW ، ZI و BSS. نیز معروف است.
- مثلا موقعی که یک struct تعریف می کنیم و آن را در یک تابع تعریف می کنیم. مقادیر این struct در stack تعریف می شود که بخشی از حافظه ی Data است.
- اگر یک متغیر local تعریف کنیم آن در stack تعریف می شود.
- اگر یک struct رو global تعریف کنیم، مقادیر این stack در بخش اصلی Data قرار می گیرد. متغیر هم همین طور.
- اگر یک آرایه را malloc کنیم اطلاعات در heap که باز هم بخشی از Data است قرار می گیرد.
- اگر یک ساختمان را new یا malloc کنیم نیز باز Heap است و در Data قرار می گیرد.
- یک متغیر const در حافظه ی Code تعریف می شود.
-define# ها هم بسته به casting در Code و یا Data تعریف می شوند.
در سیستم های EABI که نرم افزار نوشته شده باید تحت یک OS استفاده شود. حافظه ی Data که درون رم است.
سوال اول) در مورد اینکه حافظه ی Code در این برنامه ها کجاست اطلاعاتی ندارم، نمی دانم که به رم بارگذاری می شود و یا از روی هارد اجرا می شود. کدام؟
در سیستم های none-eabi که به Bare Metal نیز معروف هستند (نظیر میکروکنترلرها) حافظه ی code همان Flash داخلی و یا خارجی آنهاست و حافظه ی Data رم آنهاست.
حال می ماند بحث کلاس ها. تا آنجا که من می دانم زمانی که کلاسی به صورت محلی new شود خود متغیرش در stack و مقادیرش در heap خواهد بود. تا اینجا مانند struct هاست.
سوال دوم) کلاس ها دارای توابع نیز هستند. وضعیت متغیرهای آن ها و عناصر static که مشخص است. این توابع درونی کلاس ها در هنگام new کردن چه می شوند؟ به رم بارگذاری می شوند؟ یا یک اشاره گر به حافظه ی Code خواهند داشت؟ پاسخ این سوال می تواند به مدیریت Heap کمک کند.
ممنون.