رامین کمالی
رامین کمالی
خواندن ۴ دقیقه·۲ ماه پیش

مدیریت حافظه در برنامه‌نویسی شی‌گرا در MQL5: کی و کجا باید از Heap و Stack استفاده کنیم ؟ + تعریف این دو حافظه

در برنامه‌نویسی، حافظه به شکلی سازمان‌دهی می‌شه که برنامه بتونه داده‌ها رو به صورت مؤثر مدیریت کنه. دو نوع حافظه اصلی که همیشه در کار با زبان‌های برنامه‌نویسی شی‌گرا باهاشون سروکار داریم، stack و heap هستند. در اینجا می‌خوایم ابتدا با تفاوت‌های این دو نوع حافظه آشنا بشیم و سپس نقش اونا رو در مدیریت شی‌ها بررسی کنیم.

حافظه Stack: سریع ولی موقتی !

حافظه stack یک بخش از حافظه است که به صورت خودکار و سریع عمل می‌کنه. هر وقت یک تابع یا متد (method) در برنامه اجرا می‌شه، فضای مورد نیاز برای متغیرهای محلی و پارامترهای ورودی توی stack ذخیره می‌شه. این حافظه بسیار سریعه، چون به شکل خودکار مدیریت می‌شه. هر وقت تابع به انتها می‌رسه، حافظه مربوط به اون تابع به طور خودکار آزاد می‌شه.

ویژگی‌هاش از این قرارن :

  • مدیریت خودکار: زمانی که یک تابع تموم می‌شه، حافظه استفاده‌شده در stack خود به خود آزاد می‌شه.
  • سرعت بالا: دسترسی به داده‌ها در stack خیلی سریعه.
  • محدودیت اندازه: حافظه stack به دلیل مدیریت خودکار، فضای محدودی داره و برای ذخیره‌سازی داده‌های بزرگ مناسب نیست.

حافظه Heap: انعطاف‌پذیر ولی دستی!

در مقابل stack، حافظه heap وجود داره که انعطاف‌پذیری بیشتری داره و برای داده‌هایی استفاده می‌شه که نیاز داریم تا طولانی‌تر از یک تابع یا متد در دسترس بمونن. اما مدیریت heap به صورت دستی انجام می‌شه، یعنی برنامه‌نویس باید خودش حافظه رو اختصاص بده و در زمان مناسب هم اون رو آزاد کنه. وقتی داده‌ای رو در heap ذخیره می‌کنیم، این داده تا زمانی که به صورت صریح (مثلاً با دستور delete) حذف نشه، توی حافظه باقی می‌مونه.

ویژگی‌هاش از این قرارن :

  • مدیریت دستی: باید خودتون تصمیم بگیرید چه زمانی حافظه اختصاص بدید و چه زمانی آزادش کنید.
  • انعطاف‌پذیری: حافظه heap فضای بیشتری در اختیار داره و می‌تونه داده‌های بزرگتر رو ذخیره کنه.
  • سرعت کمتر: نسبت به stack دسترسی به داده‌های heap کمی کندتره.

پس به صورت خلاصه تفاوت Stack و Heap اینان :

  • مدیریت حافظه: حافظه stack به صورت خودکار مدیریت می‌شه ولی heap نیاز به مدیریت دستی داره.
  • زمان زندگی (Lifetime): داده‌های stack تنها تا پایان اجرای تابع یا متد زنده می‌مونن، در حالی که داده‌های heap تا زمانی که خودمون حذفشون نکنیم، باقی می‌مونن.
  • سرعت: stack سریع‌تره و heap به دلیل مدیریت دستی و تخصیص پویا، کندتره.
  • اندازه حافظه: stack معمولاً محدودیت اندازه داره ولی heap فضای بیشتری در اختیار می‌ذاره.

حالا که با تفاوت‌های بین stack و heap آشنا شدیم، وقتشه بریم سراغ موضوع اصلی: چطور از این مفاهیم در برنامه‌نویسی شی‌گرا استفاده کنیم؟

چی می‌شه اگه شی‌ها توی heap ذخیره بشن؟

به طور معمول، وقتی یک شی داخل یک تابع تعریف می‌شه، اون شی در حافظه stack ذخیره می‌شه و با اتمام تابع، به طور خودکار از بین می‌ره. اما اگر بخوایم شی‌هایی تعریف کنیم که بعد از اتمام تابع هم زنده بمونن و بشه بیرون از تابع هم بهشون دسترسی داشت، باید از حافظه heap استفاده کنیم. اینجاست که new وارد عمل می‌شه.

چی کار کنیم که شی‌ها زنده بمونن؟

برای این کار باید از new استفاده کنیم. new یک فضای جدید در heap اختصاص می‌ده و شی رو اونجا ذخیره می‌کنه. به این ترتیب، شی حتی بعد از تموم شدن تابع همچنان در حافظه باقی می‌مونه.

اینجوری هم می تونیم بگیم که new ابتدا یک شی در حافظه heap ایجاد می‌کنه و سپس آدرس اون شی رو به‌عنوان یک اشاره‌گر (pointer) برمی‌گردونه. به عبارت دیگه، خود شی در حافظه ساخته می‌شه، اما چیزی که ما دریافت می‌کنیم، آدرس اون شی است، نه خود شی. به همین دلیل، برای دسترسی به اعضا و متدهای شی، باید از اشاره‌گر استفاده کنیم.

که برای این میایم با استفاده از علامت (*)، به شی‌ای که اشاره‌گر بهش اشاره می‌کنه دسترسی پیدا می کنیم. یعنی در واقع شی رو از طریق اشاره‌گر بازیابی می‌کنیم و بعد به اعضای اون دسترسی داریم.

خلاصه بگم چون new آدرس شی رو برمی‌گردونه، همیشه باید از اشاره‌گرها برای تعامل با شی‌هایی که در heap ساخته شدن استفاده کنیم.

پاک کردن شی ها فراموش نشه!

شی‌هایی که در heap تعریف می‌شن، به صورت خودکار از حافظه حذف نمی‌شن. یعنی اگه شما به سیستم نگید که اون شی رو پاک کنه، همچنان توی حافظه باقی می‌مونه. اینجا باید از دستور delete استفاده کنیم تا شی‌های ساخته‌شده رو پاک کنیم و حافظه رو آزاد کنیم.

جمع‌بندی

در برنامه‌نویسی شی‌گرا داخل MQL5، وقتی بخوایم داده‌ها یا شی‌هایی داشته باشیم که طول عمر بیشتری از یک تابع داشته باشن، باید از حافظه heap استفاده کنیم. این کار رو با دستور new انجام می‌دیم و توجه داشته باشیم که مدیریت حافظه در heap دستی هست، پس باید به کمک delete، شی‌های اضافه رو از حافظه حذف کنیم تا دچار مشکلاتی مثل پر شدن حافظه نشیم.

مدیریت حافظهheapstack
برنامه نویس MQL و پایتون https://www.youtube.com/@mqlexpert/videos
شاید از این پست‌ها خوشتان بیاید