برنامه نویسی

پشته ، پشته و نحوه عملکرد تماس های عملکرد

بیشتر برنامه نویسان در مورد حافظه پشته و پشته می شنوند ، اما بسیاری از آنها واقعاً به معنای این نیستند تا زمانی که یک اشکال آنها را سخت نیش بزند. به خصوص در زبانهایی مانند C یا C ++ ، جایی که شما جمع کننده زباله هستید – درک اهمیت حافظه. خیلی زیاد

نقشه حافظه ای که باید بدانید

هنگامی که یک برنامه C را اجرا می کنید ، معمولاً حافظه به این بخش ها تقسیم می شود:

  • کد: دستورالعمل های کامپایل شده ، یعنی برنامه شما به زبان ماشین ترجمه شده است.
  • داده های اولیه: برخی از ثابت ها و لفظات ، متغیرها و متغیرهای جهانی مشخص شده static توابع داخل
  • داده های ناآگاه: فضای محفوظ برای متغیرهای جهانی ناآگاه. این اغلب “بلوک توسط نماد شروع شده” (BSS) نامیده می شود ، که به نام یک دستورالعمل رایانه قدیمی نامگذاری شده است.
  • Heap: یک حافظه بی نظیر که توسط برنامه نویس با استفاده از برنامه ساز سازماندهی می شود new یا mallocبشر
  • پشته: یک شمع حافظه به طور خودکار مرتب و مرتب از حافظه مورد استفاده برای تماس های عملکردی. این آرگومان های عملکردی ، متغیرهای محلی و اطلاعات حسابداری را در خود جای داده است.

بخشهای حافظه

در یک تماس عملکردی چه اتفاقی می افتد؟

بیایید یک عملکرد ساده انجام دهیم:

int increment(int x) {
    int result = x + 1;
    return result;
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کی increment(3) نامیده می شود:

  • آدرس بازگشت به پشته منتقل می شود (بنابراین برنامه می داند که به کجا برگردد).
  • یک قاب پشته با:
    • بحث x
    • متغیر محلی result

نمونه پشته

  • هنگامی که عملکرد باز می گردد ، قاب پشته آن “ظاهر می شود” ، و آن حافظه رسماً از بین می رود.
  • با این حال ، در عمل هنوز در آنجا وجود دارد اما به محض فراخوانی عملکرد دیگری ، باید رونویسی شود. این همان چیزی است که می تواند این مشکل را بسیار مرموز کند.

بنابراین متغیرهای محلی فقط تا زمانی که عملکرد اجرا شود وجود دارد. آنها روی پشته زندگی می کنند. و این جایی است که افراد با مشکل روبرو می شوند.

چرا این مهم است – یک اشتباه کلاسیک

char* create_message() {
    char result[] = "Hello!";
    return result;
}

void print_date() {
  // ...
}

int main() {
  char* message = create_message();
  print_date();
  printf("%s\n", message);
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

متغیر محلی result در پشته زندگی می کند. کی create_message() بازده ، قاب پشته انجام می شود. اکنون یک نشانگر به حافظه بازگردانده می شود که توسط تماس عملکرد بعدی استفاده می شود. این رفتار نامشخص در C. است. یک روش مودبانه برای گفتن “موفق باشید”.

تکامل پشته

پس از تماس print_date مقدار ایجاد شده در create_message() احتمالاً توسط چیز دیگری رونویسی می شود ، اغلب حتی با نوع داده صحیح.

آیا می خواهید نتیجه را زنده نگه دارید؟

به جای آن از پشته استفاده کنید

char* create_message() {
    char* result = malloc(7); // allocate memory on the heap
    strncpy(result, "Hello!", 7);
    return result;
}

void print_date() {
  // ...
}

int main() {
  char* message = create_message();
  print_date();
  printf("%s\n", message);
  free(message); // deallocate memory on the heap
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

با استفاده از پشته

اکنون محتوای پیام در پشته ایجاد می شود که تا زمان وجود آن ادامه خواهد یافت free()ویرایش ، مستقل از هرگونه تماس عملکردی یا دستکاری پشته.

پیشخدمت

  • حافظه پشته سریع و به طور خودکار مدیریت می شود ، اما کوتاه مدت است.
  • حافظه Heap به صورت دستی مدیریت و مداوم در تماس با عملکرد است اما نشت آن آسان است.
  • در زبانهای غیر جمع آوری شده ، فراموش کردن این تمایز منجر به اشکالات واقعی می شود: بدون استفاده از پس از آن ، نشت حافظه ، نشانگرهای آویزان.

این نوع درک بنیادی بسیاری از اسرار را در C ، C ++ ، زنگ زدگی باز می کند و حتی توضیح می دهد که چرا برخی از چیزها در جاوا یا پایتون به طرز عجیبی رفتار می کنند.

تماس

من یک مدرس دانشگاهی هستم که از کمک به توسعه دهندگان در درک چگونگی کار در زیر کاپوت لذت می برم. اگر در حال یادگیری برنامه نویسی یا تلاش با C یا C ++ هستید ، انتقال از جاوا یا فقط می خواهید در مورد حافظه ، اشکال زدایی یا برنامه نویسی سطح پایین گپ بزنید ، احساس راحتی کنید. شما می توانید از طریق تماس بگیرید @mailboxبشرorg، یا نظر خود را در زیر بگذارید. خوشحالم که مشاوره دوستانه یا تدریس ارائه می دهم. اگر به دنبال کمک 1: 1 یا تدریس در مورد C/C ++ ، برنامه نویسی سیستم ها یا اشکال زدایی هستید ، من در حال ارائه جلسات پشتیبانی هستم. دسترسی پیدا کنید و می توانیم ببینیم چه چیزی کار می کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا