۱۴۰۴/۰۷/۰۹ Nebular

تفاوت stack , heap در سی شارپ

۱. Stack (پشته)

  • کاربرد:
    ذخیره متغیرهای value type و آدرس‌های مرجع برای reference type (نه خود شیء).
  • ویژگی‌ها:
    1. سریع و مدیریت ساده: وقتی بلوک کد تمام می‌شود، حافظه خودکار آزاد می‌شود.
    2. اندازه محدود: معمولاً چند مگابایت، بنابراین برای داده‌های خیلی بزرگ مناسب نیست.
    3. LIFO (Last In, First Out): آخرین چیزی که ذخیره شد، اولین چیزی است که برداشته می‌شود.
    4. Scope محلی: وقتی متغیر از scope خارج می‌شود، حافظه آزاد می‌شود.
  • مثال:
void Example()
{
    int x = 10;   // روی stack ذخیره می‌شود
    int y = 20;   // روی stack ذخیره می‌شود
} // x و y وقتی بلوک تمام شد، آزاد می‌شوند

هر متغیری که Value Type باشد و خارج از کلاس نباشد، روی Stack ذخیره می‌شود.


۲. Heap (انبار حافظه)

  • کاربرد:
    ذخیره شیءهای Reference Type مثل class, string, array.
  • ویژگی‌ها:
    1. مدیریت توسط Garbage Collector (GC): حافظه خودکار پاک می‌شود وقتی هیچ مرجعی به شیء وجود نداشته باشد.
    2. بزرگ و انعطاف‌پذیر: می‌توان اشیاء بزرگ یا طول عمر طولانی ایجاد کرد.
    3. کندتر از stack: چون GC باید بررسی کند چه چیزهایی دیگر استفاده نمی‌شوند.
    4. نیاز به مرجع (Reference): برای دسترسی به داده‌ها، معمولاً یک آدرس در Stack نگه داشته می‌شود.
  • مثال:
class Person
{
    public string Name;
}

void Example()
{
    Person p = new Person(); // شیء Person روی heap ساخته می‌شود
    p.Name = "Ali";          // نام روی heap ذخیره می‌شود
} // وقتی p از scope خارج شود، GC ممکن است این شیء را جمع‌آوری کند

توجه: متغیر p خود یک reference است که روی stack ذخیره می‌شود، اما داده واقعی (Person) روی heap است.


۳. مقایسه سریع Stack و Heap

ویژگیStackHeap
نوع دادهValue Type / مرجع ReferenceReference Type (شیء)
سرعت دسترسیسریعکندتر
مدیریت حافظهخودکار و سادهتوسط GC
اندازهکوچکبزرگ
طول عمرکوتاه، وابسته به scopeطولانی، وابسته به مرجع
نحوه آزادسازیهنگام خروج از scopeوقتی GC تشخیص دهد

نکات مهم برای آزمون:

  1. Value Type → Stack، Reference Type → Heap
  2. وقتی Reference Type را assign می‌کنی، فقط مرجع کپی می‌شود، خود شیء در heap یکسان است
  3. Stack سریع و محدود است، Heap کندتر و بزرگ‌تر است
  4. Boxing → value type از stack به heap می‌رود
Accept Cookies
Accept Cookies
[your-shortcode]